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

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





Back to the top