Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Setting Foreign Reference Mappings to Read-Only

Hi

I have attached a sample program showing three tables - T1, T2, T6.

Ti has columns ai,bi, ... ei. i=1,2,6.

T1 has primary key a1,b1.
T2 has primary key a2,b2.
T6 has primary key a6,b6.

The attached program throws the following exception. Can this be fixed somehow?

Exception [EclipseLink-46] (Eclipse Persistence Services - 2.2.0.v20110107-r8783): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: There should be one non-read-only mapping defined for the primary key field [t6.a6].
Descriptor: RelationalDescriptor(jpatest.t6 --> [DatabaseTable(t6)])

Runtime Exceptions:
---------------------------------------------------------

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:547)
    at org.eclipse.persistence.sessions.Project.addDescriptors(Project.java:295)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.addDescriptors(DatabaseSessionImpl.java:226)
    at org.eclipse.persistence.dynamic.DynamicHelper.addTypes(DynamicHelper.java:222)


Thanks in Advance!

On 4/18/2011 7:21 PM, Rohit Banga wrote:
Hi All

To avoid ECLIPSELINK-00046, ECLIPSELINK-00048 (http://wiki.eclipse.org/EclipseLink_Exception_Error_Reference_%28ELUG%29) with Dynamic JPA, I am planning to use the following strategy.

If a DirectToFieldMapping is defined for a primary key field of a DynamicType, then for any OneToOneMapping that uses this field set the OneToOneMapping as read-only.

Can someone please clarify the following:

1. Is the above a reasonable and safe way to avoid the exceptions at runtime?

2. What is the impact of having a foreign reference mapping as read-only? Can I not persist changes to the target entity of the mapping?


--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
_______________________________________________ eclipselink-users mailing list eclipselink-users@xxxxxxxxxxx https://dev.eclipse.org/mailman/listinfo/eclipselink-users

--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
import org.eclipse.persistence.dynamic.DynamicClassLoader;
import org.eclipse.persistence.dynamic.DynamicHelper;
import org.eclipse.persistence.dynamic.DynamicTypeBuilder;
import org.eclipse.persistence.internal.sessions.DatabaseSessionImpl;
import org.eclipse.persistence.jpa.dynamic.JPADynamicTypeBuilder;
import org.eclipse.persistence.sessions.DatabaseLogin;
import org.eclipse.persistence.sessions.DatabaseSession;

public class MultipleWritableMappingsTest
{
    public static void main(String[] args)
    {
        DatabaseLogin login = new DatabaseLogin();
        login.setUserName("******");
        login.setPassword("******");
        login.setDriverURLHeader("jdbc:oracle:thin:@");
        login.setDriverClassName("oracle.jdbc.OracleDriver");
        login.setDatabaseURL("****************************");
        DatabaseSession session = new DatabaseSessionImpl(login);

        session.login();

        DynamicHelper helper = new DynamicHelper(session);
        DynamicClassLoader dcl = helper.getDynamicClassLoader();

        Class<?> t1Type = dcl.createDynamicClass("jpatest.t1");
        DynamicTypeBuilder t1Builder = new JPADynamicTypeBuilder(t1Type, null, "t1");
        t1Builder.setPrimaryKeyFields("a1", "b1");
        t1Builder.addDirectMapping("a1", String.class, "a1");
        t1Builder.addDirectMapping("b1", String.class, "b1");
        t1Builder.addDirectMapping("c1", String.class, "c1");
        t1Builder.addDirectMapping("d1", String.class, "d1");
        t1Builder.addDirectMapping("e1", String.class, "e1");

        Class<?> t2Type = dcl.createDynamicClass("jpatest.t2");
        DynamicTypeBuilder t2Builder = new JPADynamicTypeBuilder(t2Type, null, "t2");
        t2Builder.setPrimaryKeyFields("a2", "b2");
        t2Builder.addDirectMapping("a2", String.class, "a2");
        t2Builder.addDirectMapping("b2", String.class, "b2");
        t2Builder.addDirectMapping("c2", String.class, "c2");
        t2Builder.addDirectMapping("d2", String.class, "d2");
        t2Builder.addDirectMapping("e2", String.class, "e2");

        Class<?> t6Type = dcl.createDynamicClass("jpatest.t6");
        DynamicTypeBuilder t6Builder = new JPADynamicTypeBuilder(t6Type, null, "t6");
        t6Builder.setPrimaryKeyFields("a6");
//        t6Builder.addDirectMapping("a6", String.class, "a6");
        t6Builder.addDirectMapping("b6", String.class, "b6");
        t6Builder.addDirectMapping("c6", String.class, "c6");
        t6Builder.addDirectMapping("d6", String.class, "d6");
        t6Builder.addDirectMapping("e6", String.class, "e6");

        t6Builder.addOneToManyMapping("t1.t6", t1Builder.getType(), "b1");
        t1Builder.addOneToOneMapping("t1.t6", t6Builder.getType(), "b1").setIsReadOnly(true);
        
        helper.addTypes(false, false, t1Builder.getType(), t2Builder.getType(), t6Builder.getType());
    }

Back to the top