[jboss-user] [Persistence, JBoss/CMP, Hibernate, Database] - How to map @OneToOne with Primary key association
jfrankman
do-not-reply at jboss.com
Fri Sep 21 16:30:07 EDT 2007
I have two classes Client and Drivingdistance with a one to one association. The id of the Client is the PK and FK in DrivingDistance. My mapping annotations are as follows:
Client class:
@Table(name="FBCLIENT")
| @Name("client")
| @Scope(ScopeType.SESSION)
| public class ClientVO implements Serializable
| {
| @Id @NotNull @Column(name="CLIENTID")
| public Long getId() {
| return id;
| }
| @OneToOne(cascade = CascadeType.ALL)
| @PrimaryKeyJoinColumn()
| public DrivingDistanceVO getDrivingDistance()
| {
| return drivingDistance;
| }
| ...}
Driving Distance
@Entity
| @Table(name="FBDRVDSTNC")
| @Name("drivingDistance")
| public class DrivingDistanceVO implements Serializable
| {
| @Id @Column(name="CLIENTID")
| @GeneratedValue(generator="foreign")
| @GenericGenerator(name="foreign", strategy = "foreign", parameters={ @Parameter(name="property", value="client") })
| public Long getId() {
| return id;
| }
| @OneToOne(mappedBy="drivingDistance")
| public ClientVO getClient()
| {
| return client;
| }
| }
If I try to assign a driving distance to the client and save it:
ClientVO client=(ClientVO)q.getSingleResult();
|
|
| DrivingDistanceVO vo2=new DrivingDistanceVO();
| //vo2.setId(new Long(225415));
| vo2.setLocation1(new Long(48254));
| vo2.setLocation2(new Long(171767));
| vo2.setUriString("http://www.google.com/intl/en_ALL/images/logo.gif");
| if (client.getDrivingDistance()==null)
| {
| client.setDrivingDistance(vo2);
| em.merge(client);
| }
I get the following error:
javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property: client
| at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:567)
| at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:210)
| at com.idfbins.nexus.business.test.ClientDrivingDistanceTest.testClientDriveDistancePersist(ClientDrivingDistanceTest.java:63)
| Caused by: org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property: client
| at org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:44)
| at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:98)
| at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:165)
| at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:102)
| at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:51)
| at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:679)
| at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:663)
| at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:667)
| at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:201)
| ... 22 more
| ... Removed 21 stack frames
I have poured over the documentation and forums but can't understand why this is failing. I have seen others ask similar questions, but have not found any answers. I have noticed that if I call em.persist instead of em.merge I do not get this error. However, I thought that since the client already exists in the database that merge would be the appropriate method to call.
So, can anyone explain why I am getting the message "org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property: client
" even after I have assigned the driving distance to the client ( client.setDrivingDistance(vo2);
)
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4087422#4087422
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4087422
More information about the jboss-user
mailing list