Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] EclipseLink persisting error (Missing mapping for field)

Hello Leon,

referencedColumnName doesn't 'need' to be in caps, it just needs to match in order for the referenced value to be found/used. The referencedColumnName is just a foreign key, and so refer to a column that has a mapping in the IndustrialFamily entity in order for this column to be set - in this case IndustrialFamily's @ID field id. Because you haven't specified the column name on id it defaults to "ID" forcing the referencedColumnName to also be "ID". When you look at the SQL EclipseLink will generate, you will see that it uses the column names exactly as provided ie"family_id", "ID" etc. This allows you to fully control what the field names are, allowing you to specify case sensitive fields (ie "/"MixedCaseName/"" allows the exact case to be used for the column in Oracle). It is important that the column names used should match the actual column names as they will appear in and be returned from the database.
Best Regards,
Chris


Leon Derks wrote:
Hello Christopher,

Indeed, changing @JoinColumn(name="family_id", referencedColumnName = "id") into @JoinColumn(name="family_id", referencedColumnName = "ID") solved the problem.

But why is it allowed to joinColumn(name="family_id".. I would expect this to be joinColumn(name="FAMILY_ID" ....

Or do only referencedColumnName's need to be written in capitals?

greetz,
Leon



christopher delahunt wrote:
Hello Leon,

The JoinColumn in the @ManyToMany mapping is using "id" for the referencedColumnName. EclipseLink is case sensitive (because Java string comparisons are). Since EclipseLink defaults the IndustrialFamily's id attribute column name to "ID", it can't find a "id" column in in IndustrialFamily. The referencedColumnName values used to match the actual database column names defined or generated by default. The solution is to change the referencedColumnName value to "ID", or to define the @Id column name to be "id".
Best Regards,
Chris

Leon Derks wrote:
Hello

I have another problem.
When I am persisting an object using eclipselink, I get a Missing mapping for field error. (see stacktrace below)
Saving the object with Hibernate gives no error.

I have also added a part of my jpa mapping. The strange thing is that it is working correctly with hibernate.

Is this a bug?

@Entity
@Table(schema="PLI", name = "PLI_CATALOG_PRODUCTS")
@DiscriminatorColumn(name="PRODUCT_TYPE")
public abstract class CatalogProduct{
     @Id
   @GeneratedValue(generator="seqGen")
@SequenceGenerator(name="seqGen",sequenceName="PLI_SEQ", allocationSize=1)
   private long id;

   private String code;
     @ManyToOne(cascade=PERSIST)
   @JoinColumn(name="family_id", referencedColumnName = "id")
   private IndustrialFamily industrialFamily;
  ......
}

@Table(schema="PLI", name = "PLI_INDUSTRIAL_FAMILIES")
@Entity
public class IndustrialFamily {
     @Id
   @GeneratedValue(generator="seqGen")
@SequenceGenerator(name="seqGen",sequenceName="PLI_SEQ", allocationSize=1)
   private long id;

    .....
}

Tables:

CREATE TABLE PLI_INDUSTRIAL_FAMILIES
(
ID NUMBER(10, 0) NOT NULL,
CODE VARCHAR2(20) NOT NULL,
NAME VARCHAR2(100) NOT NULL
)
;

CREATE TABLE PLI_CATALOG_PRODUCTS
(
ID NUMBER(10, 0) NOT NULL,
CODE VARCHAR2(500) NOT NULL,
FAMILY_ID NUMBER(10, 0) NOT NULL
)
;


javax.persistence.RollbackException: Exception [EclipseLink-45] (Eclipse Persistence Services - 1.0 (Build SNAPSHOT - 20080409)): org.eclipse.persistence.exceptions.DescriptorException Exception Description: Missing mapping for field [PLI.PLI_INDUSTRIAL_FAMILIES.id]. Descriptor: RelationalDescriptor(********.model.IndustrialFamily --> [DatabaseTable(PLI.PLI_INDUSTRIAL_FAMILIES)]) at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:109) at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:70)
   at ********.test.ImportTest.testSaveImport(ImportTest.java:44)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at junit.framework.TestCase.runTest(TestCase.java:154)
   at junit.framework.TestCase.runBare(TestCase.java:127)
   at junit.framework.TestResult$1.protect(TestResult.java:106)
   at junit.framework.TestResult.runProtected(TestResult.java:124)
   at junit.framework.TestResult.run(TestResult.java:109)
   at junit.framework.TestCase.run(TestCase.java:118)
   at junit.framework.TestSuite.runTest(TestSuite.java:208)
   at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) Caused by: Exception [EclipseLink-45] (Eclipse Persistence Services - 1.0 (Build SNAPSHOT - 20080409)): org.eclipse.persistence.exceptions.DescriptorException Exception Description: Missing mapping for field [PLI.PLI_INDUSTRIAL_FAMILIES.id]. Descriptor: RelationalDescriptor(********.model.IndustrialFamily --> [DatabaseTable(PLI.PLI_INDUSTRIAL_FAMILIES)]) at org.eclipse.persistence.exceptions.DescriptorException.missingMappingForField(DescriptorException.java:938) at org.eclipse.persistence.internal.descriptors.ObjectBuilder.extractValueFromObjectForField(ObjectBuilder.java:1856) at org.eclipse.persistence.mappings.OneToOneMapping.writeFromObjectIntoRow(OneToOneMapping.java:1058) at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildRow(ObjectBuilder.java:830) at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildRow(ObjectBuilder.java:818) at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:430) at org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:78) at org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:88) at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:290) at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58) at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:653) at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:576) at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:114) at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:86) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2603) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1061) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1045) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:991) at org.eclipse.persistence.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:254) at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsForClassWithChangeSet(CommitManager.java:229) at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:185) at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:2991) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1240) at org.eclipse.persistence.internal.jpa.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:416) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1332) at org.eclipse.persistence.internal.jpa.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:145) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1000) at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:91)
   ... 20 more



_______________________________________________
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