1

以下の実体関連モデルがあります。Userは親エンティティです。DistrictUserDetailは子です。

@Entity
@Table(name="USERS")
public class User implements Serializable {

@Id
@Column(name="ID", nullable=false)
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy = "uuid")
private String id;

    @OneToOne(cascade= {CascadeType.ALL})
    @PrimaryKeyJoinColumn(name="ID", referencedColumnName="USER_ID")
    public DistrictUserDetail districtUserDetail;

    ... other properties..

これは親エンティティです。子エンティティの主キーはユーザーエンティティの外部キーであり、そのキープロパティを次のように定義しています。

@Entity
@Table(name="DISTRICT_USER_DETAIL")
public class DistrictUserDetail implements Serializable{



@Id  
@Column(name="USER_ID")  
@GeneratedValue(generator="foreign")   
@GenericGenerator(name="foreign", strategy = "foreign",   
parameters={@Parameter(name="property",value="user")})  
protected String userId;  

@OneToOne(mappedBy="districtUserDetail")  
User user; 

    ... other properties

したがって、新しいUserを作成し、新しいDistrictUserを作成し、DistrictUserをUserに設定してUserを保存すると、Userが保存され、cascadeAllにより、DistrictUserも保存されることが期待されます。

これが私たちのテストです:

public void testSaveUserWithDistrictUserDetails() throws Exception {
    User user = new User();
    user.setFirstName("John");
    user.setLastName("Doe");
    user.setUserName("U11111");


    DistrictUserDetail userDetail = new DistrictUserDetail();

    userDetail.setIsLoginAllowed(Boolean.TRUE);
    userDetail.setIsSuperintendent(Boolean.TRUE);

    user.setDistrictUserDetail(userDetail);

    User newUser = dao.save(user);

    assertTrue(newUser!=null);
    assertTrue(newUser.getId()!=null);
}

ただし、次の休止状態の例外が発生します。

Caused by: org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property: user
at org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:44)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99)
at org.hibernate.event.def.DefaultMergeEventListener.mergeTransientEntity(DefaultMergeEventListener.java:315)
at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:283)
at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:238)
at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:688)
at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:670)
at org.hibernate.engine.CascadingAction$6.cascade(CascadingAction.java:245)
at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:269)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:217)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:170)
at org.hibernate.engine.Cascade.cascade(Cascade.java:131)
at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456)
at org.hibernate.event.def.DefaultMergeEventListener.mergeTransientEntity(DefaultMergeEventListener.java:352)
at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:283)
at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:238)
at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:85)
at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:678)
at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:662)
at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:666)
at org.springframework.orm.hibernate3.HibernateTemplate$23.doInHibernate(HibernateTemplate.java:817)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
... 49 more

UserエンティティがDistrictUserDetailの保存を呼び出すことができる場合、DistrictUserDetailが親ユーザー(およびその新しいID)を確認し、それを使用して保存できないのはなぜですか。

Hibernateバージョンを使用しています:3.2.7.ga基礎となるデータベースは:MySQL

どんな助けでもありがたいです。ありがとう

4

2 に答える 2

1

次のように、OneToOne のオプション属性を false に設定する必要があります。

@OneToOne(mappedBy="districtUserDetail", optional = false)  
User user; 

また、もちろん、DistrictUserDetail.user を非 null エンティティに設定する必要があります。

于 2011-05-02T09:01:11.733 に答える
1

userDeatil.useris null、これは例外が不平を言っていることです。

プロパティを削除し、双方向の関係を持たないようにすることをお勧めします。それ以外の場合は、プロパティuser.setDistrictUserDetail()も設定する必要がありuserます。

于 2011-03-08T01:13:08.350 に答える