[
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