[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] ManyToOne on non primary keys

Halo,

there is the stack trace of this issue. If it is bug or not I don't know. I will wait for your answer.
Thank's
Zdenek Machac


Exception [EclipseLink-7221] (Eclipse Persistence Services - 1.0.1 (Build 20080905)): org.eclipse.persistence.exceptions.ValidationException
Exception Description: A @JoinColumns was specified on the annotated element [private jfx.ejb.entity.Ana jfx.ejb.entity.Zak.ana] from the entity class [class jfx.ejb.entity.Zak]. When the source entity class uses a single primary key, only a single (or zero) @JoinColumn should be specified.
at org.eclipse.persistence.exceptions.ValidationException.excessiveJoinColumnsSpecified(ValidationException.java:2189)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.RelationshipAccessor.processJoinColumns(RelationshipAccessor.java:332)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.RelationshipAccessor.processJoinColumns(RelationshipAccessor.java:276)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ObjectAccessor.processOneToOneForeignKeyRelationship(ObjectAccessor.java:228)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ObjectAccessor.processOwningMappingKeys(ObjectAccessor.java:294)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ManyToOneAccessor.process(ManyToOneAccessor.java:87)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.RelationshipAccessor.processRelationship(RelationshipAccessor.java:363)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processAccessorsWithRelationships(MetadataProject.java:643)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.process(MetadataProject.java:632)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:452)
at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:303)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:830)
at org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactory(PersistenceProvider.java:189)
at weblogic.deployment.PersistenceUnitInfoImpl.createEntityManagerFactory(PersistenceUnitInfoImpl.java:330)
at weblogic.deployment.PersistenceUnitInfoImpl.<init>(PersistenceUnitInfoImpl.java:123)
at weblogic.deployment.AbstractPersistenceUnitRegistry.storeDescriptors(AbstractPersistenceUnitRegistry.java:331)
at weblogic.deployment.AbstractPersistenceUnitRegistry.loadPersistenceDescriptors(AbstractPersistenceUnitRegistry.java:111)
at weblogic.deployment.EarPersistenceUnitRegistry.<init>(EarPersistenceUnitRegistry.java:52)
at weblogic.application.internal.flow.JpaFlow.prepare(JpaFlow.java:54)
at weblogic.application.internal.BaseDeployment$1.next(BaseDeployment.java:615)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:37)
at weblogic.application.internal.BaseDeployment.prepare(BaseDeployment.java:191)
at weblogic.application.internal.EarDeployment.prepare(EarDeployment.java:16)
at weblogic.application.internal.DeploymentStateChecker.prepare(DeploymentStateChecker.java:155)
at weblogic.deploy.internal.targetserver.AppContainerInvoker.prepare(AppContainerInvoker.java:60)
at weblogic.deploy.internal.targetserver.operations.RedeployOperation.createAndPrepareContainer(RedeployOperation.java:98)
at weblogic.deploy.internal.targetserver.operations.RedeployOperation.doPrepare(RedeployOperation.java:122)
at weblogic.deploy.internal.targetserver.operations.AbstractOperation.prepare(AbstractOperation.java:217)
at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentPrepare(DeploymentManager.java:723)
at weblogic.deploy.internal.targetserver.DeploymentManager.prepareDeploymentList(DeploymentManager.java:1190)
at weblogic.deploy.internal.targetserver.DeploymentManager.handlePrepare(DeploymentManager.java:248)
at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.prepare(DeploymentServiceDispatcher.java:159)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.doPrepareCallback(DeploymentReceiverCallbackDeliverer.java:157)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.access$000(DeploymentReceiverCallbackDeliverer.java:12)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer$1.run(DeploymentReceiverCallbackDeliverer.java:45)
at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:516)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
>


James Sutherland wrote:
This should work. Please include the exception include stack trace that you
are getting. It is most likely an issue with the annotations processing, as
EclipseLink does support ManyToOne's not by primary key. If this is the
case, then please log a bug.


As a workaround you can use a DescriptorCustomizer to get the mapping
(OneToOneMapping) from the ClassDescriptor and reset the foreign key fields
(probably easiest to set one foreign key in annotations to avoid defaults,
then call addForeignKeyFieldName() to add the other).



machac wrote:
>
> Hallo,
>
> we have one problem:
>
> we use OpenJPA implementation and this use case works and we want migrate
> to EclipseLink
> but testing on entities
>
> public class Zak {
> @Id
> private int id;
>
> @Column(name="zak_number")
> private String number;
>
> @Column(name="zak_year")
> private int year;
>
> @Column(name="zak_name")
> private String name;
>
> @ManyToOne
> @JoinColumns({
> @JoinColumn(name="zak_ana", referencedColumnName="ana_number"),
> @JoinColumn(name="zak_year", referencedColumnName="ana_year")
> })
> private Ana ana;
>
> ...
> }
>
>
> public class Ana {
> @Id
> private int id;
>
> @Column(name="ana_number")
> private String number;
>
> @Column(name="ana_year")
> private int year;
>
> @Column(name="ana_name")
> private String name;
>
> ...
> }
>
> failed because EclipseLink noted then Zak used 2 joined columns to mapp
> Ana but Ana has
> only one primary key. Tables we can not changed because are from external
> SW
>
> Supports EclipseLink mapping unidirectional ManyToOne to non pripary keys
> columns?
>
> Thank's for any answer or help with such mapping.
> Zdenek Machac