Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Primary key foreign key entity relationship issue

Chris, I just uploaded three files for you to check them out. 



christopher delahunt wrote:
> 
> Hello,
> 
> Can you provide the actual classes used?  Chances are there are 
> differences between the example given and the actual classes that are 
> causing the exception.  Could you be mixing annotations on fields and 
> properties?  I would recommend making a simple test case that reproduces 
> the issue incase a bug needs to be filed.
> 
> Best Regards,
> Chris
> 
> luke2010 wrote:
>> sorry for the format
>> ============================
>> @Entity 
>> class A { 
>>
>>         @Id 
>>         @Column(name="A_ID") 
>>         @GeneratedValue(strategy = GenerationType.AUTO) 
>>         private String aId; 
>> } 
>>
>> @Entity 
>> @IDClass(BID.class) 
>> class B { 
>>
>>         @Column(name="B_ID") 
>>         @Id 
>>         private int bId; 
>>         
>>         
>>         @Id 
>>     @ManyToOne(cascade = ALL) 
>>         @JoinColumn(name="A_ID", referencedColumnName="A_ID") 
>>         @XmlTransient 
>>         private A abc; 
>> } 
>>
>> class BID{ 
>>   int bId; //same type and name as the id from B 
>>   String abc;//must be the same type as A's id, and the attribute must
>> use
>> the name of the relationship from B 
>> } 
>> ==================================
>>
>> I got the error below:
>>
>> =================================
>> Exception [EclipseLink-7150] (Eclipse Persistence Services -
>> 2.0.1.v20100213-r6600):
>> org.eclipse.persistence.exceptions.ValidationException
>> Exception Description: Invalid composite primary key specification. The
>> names of the primary key fields or properties in the primary key class
>> [ca.gc.rcmp.rtid.entities.SubjectFilePK] and those of the entity bean
>> class
>> [class ca.gc.rcmp.rtid.entities.SubjectFile] must correspond and their
>> types
>> must be the same. Also, ensure that you have specified ID elements for
>> the
>> corresponding attributes in XML and/or an @Id on the corresponding fields
>> or
>> properties of the entity class.
>>
>> ===================================
>>
>>
>>
>>
>> christopher delahunt wrote:
>>   
>>> Hello,
>>>
>>> The exception is occurring because the object model is not complete.  
>>> The specification requires that composite primary keys use an IdClass or 
>>> an EmbeddedId so that there is a key class containing all fields.  By 
>>> removing the EmbeddedId, you have removed your pk class - you will need 
>>> to specify the @IdClass to use instead. 
>>>
>>> Also, using derrivedIds means that the child class must incorporate its 
>>> parent id into its own Id.  That means if A has a composite PK, B's ID 
>>> must also include that composite pk class as well as any additional 
>>> fields it uses.  I cannot determine which class in your tree is involved 
>>> in the problem, but a simple example would be
>>>
>>> @Entity
>>> class A {
>>>
>>> 	@Id
>>> 	@Column(name="A_ID")
>>> 	@GeneratedValue(strategy = GenerationType.AUTO)
>>> 	private String aId;
>>> }
>>>
>>> @Entity
>>> @IDClass(BID.class)
>>> class B {
>>>
>>> 	@Column(name="B_ID")
>>> 	@Id
>>> 	private int bId;
>>> 	
>>> 	
>>> 	@Id
>>>     @ManyToOne(cascade = ALL)
>>> 	@JoinColumn(name="A_ID", referencedColumnName="A_ID")
>>> 	@XmlTransient
>>> 	private A a;
>>> }
>>>
>>> class BID{
>>>   int bId; //same type and name as the id from B
>>>   String a;//must be the same type as A's id, and the attribute must use
>>> the name of the relationship from B
>>> }
>>>
>>> If A has a composite pk and uses an embeddable or pk class, B would look
>>> the same (except for additional join columns of course) but BID might
>>> look
>>> like:
>>>
>>> class BID{
>>>   int bId;
>>>   AID a; //the type is the same as A's idclass/embeddedid class.  
>>> }
>>>
>>> The specification has some examples at:
>>>   http://jcp.org/en/jsr/detail?id=317
>>>
>>> Best Regards,
>>> Chris
>>>
>>> luke2010 wrote:
>>>     
>>>> I am using EclipseLink 2.0.1. the error i mentioned is shown up in
>>>> eclipse
>>>> IDE, if I ignore this error, and continue running my testcase, it will
>>>> throw
>>>> error like below:
>>>>
>>>> ==========================
>>>>
>>>> junit.framework.AssertionFailedError: Exception in constructor: test1
>>>> (Local
>>>> Exception Stack: 
>>>> Exception [EclipseLink-30005] (Eclipse Persistence Services -
>>>> 2.0.1.v20100213-r6600):
>>>> org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
>>>> Exception Description: An exception was thrown while searching for
>>>> persistence archives with ClassLoader:
>>>> sun.misc.Launcher$AppClassLoader@1aa6b1
>>>> Internal Exception: javax.persistence.PersistenceException: Exception
>>>> [EclipseLink-28018] (Eclipse Persistence Services -
>>>> 2.0.1.v20100213-r6600):
>>>> org.eclipse.persistence.exceptions.EntityManagerSetupException
>>>> Exception Description: Predeployment of PersistenceUnit [brancoch]
>>>> failed.
>>>> Internal Exception: java.lang.ClassCastException:
>>>> org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.IdAccessor
>>>> 	at
>>>> org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:126)
>>>> 	at
>>>> org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:133)
>>>> 	at
>>>> org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:65)
>>>> 	at
>>>> javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)
>>>> 	at
>>>> javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)
>>>> 	at
>>>> ca.gc.rcmp.rtid.entities.test.TestAfisSubject.<init>(TestAfisSubject.java:31)
>>>> 	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
>>>> Method)
>>>> 	at
>>>> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
>>>> 	at
>>>> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
>>>> 	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
>>>> 	at junit.framework.TestSuite.createTest(TestSuite.java:61)
>>>> 	at junit.framework.TestSuite.addTestMethod(TestSuite.java:283)
>>>> 	at junit.framework.TestSuite.<init>(TestSuite.java:146)
>>>> 	at
>>>> org.junit.internal.runners.JUnit38ClassRunner.<init>(JUnit38ClassRunner.java:67)
>>>> 	at
>>>> org.junit.internal.builders.JUnit3Builder.runnerForClass(JUnit3Builder.java:14)
>>>> 	at
>>>> org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
>>>> 	at
>>>> org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
>>>> 	at
>>>> org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
>>>> 	at
>>>> org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
>>>> 	at
>>>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:29)
>>>> 	at
>>>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
>>>> 	at
>>>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:40)
>>>> 	at
>>>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:30)
>>>> 	at
>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
>>>> 	at
>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>>>> 	at
>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>>>> 	at
>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
>>>> Caused by: javax.persistence.PersistenceException: Exception
>>>> [EclipseLink-28018] (Eclipse Persistence Services -
>>>> 2.0.1.v20100213-r6600):
>>>> org.eclipse.persistence.exceptions.EntityManagerSetupException
>>>> Exception Description: Predeployment of PersistenceUnit [brancoch]
>>>> failed.
>>>> Internal Exception: java.lang.ClassCastException:
>>>> org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.IdAccessor
>>>> 	at
>>>> org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:991)
>>>> 	at
>>>> org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.callPredeploy(JPAInitializer.java:88)
>>>> 	at
>>>> org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:124)
>>>> 	... 25 more
>>>> Caused by: Exception [EclipseLink-28018] (Eclipse Persistence Services
>>>> -
>>>> 2.0.1.v20100213-r6600):
>>>> org.eclipse.persistence.exceptions.EntityManagerSetupException
>>>> Exception Description: Predeployment of PersistenceUnit [brancoch]
>>>> failed.
>>>> Internal Exception: java.lang.ClassCastException:
>>>> org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.IdAccessor
>>>> 	at
>>>> org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:210)
>>>> 	... 28 more
>>>> Caused by: java.lang.ClassCastException:
>>>> org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.IdAccessor
>>>> 	at
>>>> org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ObjectAccessor.processId(ObjectAccessor.java:369)
>>>> 	at
>>>> org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ObjectAccessor.processOwningMappingKeys(ObjectAccessor.java:595)
>>>> 	at
>>>> org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.OneToOneAccessor.process(OneToOneAccessor.java:158)
>>>> 	at
>>>> org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.RelationshipAccessor.processRelationship(RelationshipAccessor.java:546)
>>>> 	at
>>>> org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ClassAccessor.processDerivedId(ClassAccessor.java:969)
>>>> 	at
>>>> org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.processDerivedId(EntityAccessor.java:804)
>>>> 	at
>>>> org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processAccessorsWithDerivedIDs(MetadataProject.java:1009)
>>>> 	at
>>>> org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage3(MetadataProject.java:1352)
>>>> 	at
>>>> org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:462)
>>>> 	at
>>>> org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:390)
>>>> 	at
>>>> org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:945)
>>>> 	... 27 more
>>>> )
>>>> 	at junit.framework.Assert.fail(Assert.java:47)
>>>> 	at junit.framework.TestSuite$1.runTest(TestSuite.java:97)
>>>> 	at junit.framework.TestCase.runBare(TestCase.java:134)
>>>> 	at junit.framework.TestResult$1.protect(TestResult.java:110)
>>>> 	at junit.framework.TestResult.runProtected(TestResult.java:128)
>>>> 	at junit.framework.TestResult.run(TestResult.java:113)
>>>> 	at junit.framework.TestCase.run(TestCase.java:124)
>>>> 	at junit.framework.TestSuite.runTest(TestSuite.java:232)
>>>> 	at junit.framework.TestSuite.run(TestSuite.java:227)
>>>> 	at
>>>> org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79)
>>>> 	at
>>>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
>>>> 	at
>>>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>>>> 	at
>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>>>> 	at
>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>>>> 	at
>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>>>> 	at
>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
>>>>
>>>> ===========================================
>>>>
>>>> The error I mentioned is 
>>>>
>>>> christopher delahunt wrote:
>>>>   
>>>>       
>>>>> What version are you using?  Can you provide the error and the stack
>>>>> trace?
>>>>>
>>>>> Regards,
>>>>> Chris
>>>>>
>>>>> luke2010 wrote:
>>>>>     
>>>>>         
>>>>>> In my case under eclipseLink 2.0, there are A, B  and C entity class. 
>>>>>> A
>>>>>> has
>>>>>> 1:M relationship to B, B has 1:1 relationship to C.  A has PK aId, B
>>>>>> has
>>>>>> PK
>>>>>> aId, bId, C has PK aId and bId, aId is part of PK of B and C, and
>>>>>> also
>>>>>> FK
>>>>>> to
>>>>>> A. 
>>>>>>
>>>>>> @Entity
>>>>>> class A {
>>>>>>
>>>>>> 	@Id
>>>>>> 	@Column(name="A_ID")
>>>>>> 	@GeneratedValue(strategy = GenerationType.AUTO)
>>>>>> 	private String aId;
>>>>>> 	
>>>>>> 	@OneToMany( mappedBy="a",  cascade = ALL, targetEntity=B.class)
>>>>>> 	@PrivateOwned
>>>>>> 	private Set bs;
>>>>>> }
>>>>>>
>>>>>> 1. why mappedBy="a" is always complaining that Attribute named "a"
>>>>>> has
>>>>>> invalid mapping for this relationship. If I removed the @Id in class
>>>>>> B
>>>>>> for
>>>>>> @ManyToOne, this complain will disappear. 
>>>>>>
>>>>>> @Entity
>>>>>> class B {
>>>>>>
>>>>>> 	@Column(name="B_ID")
>>>>>> 	@Id
>>>>>> 	private int bId;
>>>>>> 	
>>>>>> 	
>>>>>>     @ManyToOne(cascade = ALL)
>>>>>> 	@JoinColumn(name="A_ID", referencedColumnName="A_ID")
>>>>>> 	@Id
>>>>>> 	@XmlTransient
>>>>>> 	private A a;
>>>>>> 	
>>>>>> 	
>>>>>> 	@OneToOne(optional=false, mappedBy="b", cascade = ALL, targetEntity
>>>>>> =
>>>>>> C.class)
>>>>>>     @PrivateOwned
>>>>>>     private C c;
>>>>>> }
>>>>>>
>>>>>>
>>>>>> 1. why mappedBy="b" is always complaining that Attribute named "b"
>>>>>> has
>>>>>> invalid mapping for this relationship. If I removed the @Id in class
>>>>>> C
>>>>>> for
>>>>>> @ManyToOne, this complain will disappear. But it will compain other
>>>>>> thing
>>>>>> "Entity "C" has no Id or EmbeddedId"
>>>>>>
>>>>>> @Entity
>>>>>> Class C{
>>>>>>
>>>>>> 	@OneToOne(optional = false)
>>>>>> 	@JoinColumns({
>>>>>> 		@JoinColumn(name="A_ID", referencedColumnName="A_ID", insertable =
>>>>>> false,
>>>>>> updatable = false),
>>>>>> 		@JoinColumn(name="B_ID", referencedColumnName="B_ID", insertable =
>>>>>> false,
>>>>>> updatable = false),
>>>>>> 		})
>>>>>>     @XmlTransient		
>>>>>>     @Id
>>>>>> 	private B b;
>>>>>> }
>>>>>>
>>>>>>
>>>>>>   
>>>>>>       
>>>>>>           
>>>>> _______________________________________________
>>>>> eclipselink-users mailing list
>>>>> eclipselink-users@xxxxxxxxxxx
>>>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>>>>
>>>>>
>>>>>     
>>>>>         
>>>>   
>>>>       
>>> _______________________________________________
>>> eclipselink-users mailing list
>>> eclipselink-users@xxxxxxxxxxx
>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>>
>>>
>>>     
>>
>>   
> _______________________________________________
> eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> 
> 
http://old.nabble.com/file/p27909356/AfisSubject.java AfisSubject.java 
http://old.nabble.com/file/p27909356/AfisSubject.java AfisSubject.java 
http://old.nabble.com/file/p27909356/SubjectFile.java SubjectFile.java 
http://old.nabble.com/file/p27909356/SubjectFilePK.java SubjectFilePK.java 
-- 
View this message in context: http://old.nabble.com/Primary-key-foreign-key-entity-relationship-issue-tp27907840p27909356.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top