Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Virtual entities and XMLMetadataSource

Hi Harpreet,

Have you had problems with using virtual attributes to point at a a non-virtual entity?

BTW: You can make an Entity extensible without making it Virtual. You can define get(key) and set(key, value) methods and use them to extend a normal entity.

-Tom

On 11/12/2012 5:50 PM, Harpreet Singh wrote:
Ok, I could use relationships instead of inheritance. From what I understand
Project would have to be defined as a dynamic virtual entity because a virtual
entity can't link to static entities.

    When I talk about adding a static entity, I was wondering if it would be
    possible to have your Project as an existing entity (either static or
    dynamic) and instead of using inheritance, manage extension through a
    relationship to other objects.
    e.g. Project could have a 1-1 relationship to a class that represented the
    extra attributes in SubProject (or MiniProject, TempProject etc) and then
    you would add some logic to Project to make determining what kind of project
    you were in easy and some logic to make it transparent when you try to
    access attributes.
    -Tom



On Mon, Dec 10, 2012 at 3:49 PM, Harpreet Singh <hsingh9@xxxxxxxxx
<mailto:hsingh9@xxxxxxxxx>> wrote:

    Tom,

    Users would be adding SubProject. SubProject may include additional
    attributes that do not exist in Project. Users may add multiple children
    under Project: SubProject, MiniProject, TempProject, etc...

    Could you please explain how to "create a static entity that has a
    One-to-One with the dynamic entity and hide relationship in your getters and
    setters"? From what I can see dynamic entities can only have relationships
    to other dynamic entities.

        Hi Harpreet,

            Would would your users be adding in SubProject?  How would it be
        different
        from a Project with some virtual attributes?

        -Tom



    On Tue, Nov 13, 2012 at 3:14 PM, Harpreet Singh <hsingh9@xxxxxxxxx
    <mailto:hsingh9@xxxxxxxxx>> wrote:

        Tom, thanks for all your help. Can you expand on what you mean by create
        a static entity with a one-to-one with the dynamic entity? How would
        that work?

            Hi Harpreet,
            Currently Dynamic entities are implemented using weaving and the
            weaving support will not take into account a parent class other than
            DynamicEntityImpl. As a result, I'm afraid you won't be able to
            create a dynamic entity that is a subclass of an existing entity.
            Please feel free to add an enhancement request.
            Perhaps you can, instead create a static entity that has a
            One-to-One with the dynamic entity and hide relationship in your
            getters and setters.


        -Tom



        On Mon, Nov 12, 2012 at 12:00 PM, Harpreet Singh <hsingh9@xxxxxxxxx
        <mailto:hsingh9@xxxxxxxxx>> wrote:

            Hi Tom,
               I'm looking for both. In my project I have a entity called
            Project, which is extensible and uses VirtualAccessMethods. Using
            this and XMLMetaDataSource I allow my user to add new attributes to
            the project entity. Now I want to go further and allow the user to
            create a SubProject entity for example. This new dynamic entity
            created by the user would extend entities that I ship, e.g. Project.
            I thought I could use DynamicEntities to achieve this. However, it
            seems Project would have to extend DynamicEntityImpl and implement
            the fetchPropertiesManager method, which I'm not sure how to do. Is
            this the only way to do this in eclipselink?

                Hi Harpreet,
                    Are you looking for a dynamic entity, or just an extensible
                entity?
                    DynamicEntities must extend DynamicEntityImpl.  Any entity
                can be extensible.
                   See:
                http://wiki.eclipse.org/EclipseLink/Examples/JPA/Extensibility
                <http://wiki.eclipse.org/EclipseLink/Examples/JPA/Extensibility>
                -Tom



            On Thu, Nov 8, 2012 at 2:38 PM, Harpreet Singh <hsingh9@xxxxxxxxx
            <mailto:hsingh9@xxxxxxxxx>> wrote:

                Tom,
                  I get a little further with the latest 2.4.2 milestone. Now I
                get the error below. I guess this means that my user definable
                dynamic entity cannot extend something I ship in the product. Is
                there any other way to achieve this inheritance? I want the
                dynamic entity to extend the entity I ship with the product,
                which is not a dynamic entity.

                Caused by: java.lang.IllegalArgumentException:
                DynamicClassLoader: com.foo.Project not compatible with parent
                class org.eclipse.persistence.internal.dynamic.DynamicEntityImpl
                at
                org.eclipse.persistence.dynamic.DynamicClassLoader.checkAssignable(DynamicClassLoader.java:174)
                at
                org.eclipse.persistence.dynamic.DynamicClassLoader.createDynamicClass(DynamicClassLoader.java:167)
                at
                org.eclipse.persistence.internal.jpa.metadata.MetadataProject.createDynamicClass(MetadataProject.java:844)
                at
                org.eclipse.persistence.internal.jpa.metadata.MetadataProject.createDynamicClass(MetadataProject.java:838)
                at
                org.eclipse.persistence.internal.jpa.metadata.MetadataProject.createDynamicClass(MetadataProject.java:838)
                at
                org.eclipse.persistence.internal.jpa.metadata.MetadataProject.createDynamicClasses(MetadataProject.java:865)
                at
                org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.createDynamicClasses(MetadataProcessor.java:153)
                at
                org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:469)
                ... 60 more


                On Tue, Nov 6, 2012 at 5:30 PM, Harpreet Singh
                <hsingh9@xxxxxxxxx <mailto:hsingh9@xxxxxxxxx>> wrote:

                    In my project I need to be able to create a dynamic entity
                    which extends a regular entity. The dynamic/virtual entity
                    definition is loaded at startup from a configuration
                    database (not using eclipselink). For this I've created a
                    XMLMetadataSource which provides eclipselink with the
                    dynamic entity definition, however startup fails b/c
                    eclipselink is using the real classloader instead of the
                    dynamic classloader. I'm using EclipseLink 2.4.0.

                    Code from Metadatasource:

                    EntityAccessor accessor = new EntityAccessor();
                         accessor.setName("SubProject");
                         //dynamic entity
                         accessor.setClassName("com.foo.SubProject");
                         //regular entity, see com/foo/Project.java
                         accessor.setParentClassName("com.foo.Project");
                         accessor.setAccess("VIRTUAL");
                         accessor.setDiscriminatorValue("SP");

                         List<SecondaryTableMetadata> secondaryTables = new
                    ArrayList<SecondaryTableMetadata>();
                         SecondaryTableMetadata table = new
                    SecondaryTableMetadata();
                         table.setName("pln_sub_project");
                         secondaryTables.add(table);
                         accessor.setSecondaryTables(secondaryTables);

                         //based on Metadatasource example
                         addExtension(accessor, new
                    Extension("com.foo.SubProject", "java.lang.String", "foo"));
                         mappings.getEntities().add(accessor);

                    The problem seems to be here in
                    EntityManagerSetupImpl#deploy(Classloader, Map)

                    processor.setClassLoader(realClassLoader);
                    processor.createDynamicClasses();

                    The processor ends up using the realClassLoader instead of
                    the dynamic class loader supplied in PersistenceUnit
                    properties resulting in the following error:

                    Caused by: Exception [EclipseLink-28019] (Eclipse
                    Persistence Services - 2.4.0.v20120608-r11652):
                    org.eclipse.persistence.exceptions.EntityManagerSetupException
                    Exception Description: Deployment of PersistenceUnit [p]
                    failed. Close all factories for this PersistenceUnit.
                    Internal Exception: Exception [EclipseLink-7328] (Eclipse
                    Persistence Services - 2.4.0.v20120608-r11652):
                    org.eclipse.persistence.exceptions.ValidationException
                    Exception Description: When using VIRTUAL access a
                    DynamicClassLoader must be provided when creating the entity
                    manager factory using the eclipselink property
                    [eclipselink.classloader]. That is,
                    createEntityManagerFactory(String persistenceUnitName, Map
                    properties) and add a new DynamicClassLoader() to the Map
                    properties.
                    at
                    org.eclipse.persistence.exceptions.EntityManagerSetupException.deployFailed(EntityManagerSetupException.java:229)
                    ... 62 more
                    Caused by: Exception [EclipseLink-7328] (Eclipse Persistence
                    Services - 2.4.0.v20120608-r11652):
                    org.eclipse.persistence.exceptions.ValidationException
                    Exception Description: When using VIRTUAL access a
                    DynamicClassLoader must be provided when creating the entity
                    manager factory using the eclipselink property
                    [eclipselink.classloader]. That is,
                    createEntityManagerFactory(String persistenceUnitName, Map
                    properties) and add a new DynamicClassLoader() to the Map
                    properties.
                    at
                    org.eclipse.persistence.exceptions.ValidationException.invalidClassLoaderForDynamicPersistence(ValidationException.java:1070)
                    at
                    org.eclipse.persistence.internal.jpa.metadata.MetadataProject.createDynamicClasses(MetadataProject.java:861)
                    at
                    org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.createDynamicClasses(MetadataProcessor.java:153)
                    at
                    org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:463)
                    ... 60 more
                    [EL Severe]: ejb: 2012-11-06
                    17:17:42.19--ServerSession(29272897)--Thread(Thread[http-bio-8080-exec-3,5,main])--Local
                    Exception Stack:
                    Exception [EclipseLink-7328] (Eclipse Persistence Services -
                    2.4.0.v20120608-r11652):
                    org.eclipse.persistence.exceptions.ValidationException
                    Exception Description: When using VIRTUAL access a
                    DynamicClassLoader must be provided when creating the entity
                    manager factory using the eclipselink property
                    [eclipselink.classloader]. That is,
                    createEntityManagerFactory(String persistenceUnitName, Map
                    properties) and add a new DynamicClassLoader() to the Map
                    properties.
                    at
                    org.eclipse.persistence.exceptions.ValidationException.invalidClassLoaderForDynamicPersistence(ValidationException.java:1070)
                    at
                    org.eclipse.persistence.internal.jpa.metadata.MetadataProject.createDynamicClasses(MetadataProject.java:861)
                    at
                    org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.createDynamicClasses(MetadataProcessor.java:153)
                    at
                    org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:463)
                    at
                    org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getDatabaseSession(EntityManagerFactoryDelegate.java:186)
                    at
                    org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getMetamodel(EntityManagerFactoryDelegate.java:602)
                    at
                    org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getMetamodel(EntityManagerFactoryImpl.java:516)








_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users



Back to the top