Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 具有反向引用和级联类型的Hibernate@OneToOne映射。所有者上的ALL不会持久化子级_Mysql_Hibernate_Mapping_One To One - Fatal编程技术网

Mysql 具有反向引用和级联类型的Hibernate@OneToOne映射。所有者上的ALL不会持久化子级

Mysql 具有反向引用和级联类型的Hibernate@OneToOne映射。所有者上的ALL不会持久化子级,mysql,hibernate,mapping,one-to-one,Mysql,Hibernate,Mapping,One To One,我们有以下实体关系。用户是父实体。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")

我们有以下实体关系。用户是父实体。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
因此,当我们创建一个新用户,创建一个新的DistrictUser,并将DistrictUser设置为User和save 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);
}
但我们遇到以下hibernate异常:

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
如果用户实体可以调用DistrictUserDetail的保存,那么为什么DistrictUserDetail不能看到父用户(及其新id)并使用它来保存它呢

我们使用的是hibernate版本:3.2.7.ga 底层数据库是:MySQL

任何帮助都将不胜感激。
谢谢

userDeatil。用户
null
,这正是异常所抱怨的


我建议移除该财产,不要建立双向关系。否则,
user.setDistrictionUserDetail()
还需要设置
user
属性。

您应该将OneToOne的可选属性设置为false,如下所示:

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

当然,您还应该将DistrictUserDetail.user设置为非空实体。

正如文章标题所示,我们希望双向关系。如果没有它,它可以工作,但是我们确实需要它来满足我们的用例。此外,在调用dao.save(user)之前,我们尝试在userDetail上设置user对象,但这并没有改变结果或错误。至于userDetail.user为null,我知道这一点。这就是我问另一个问题的原因:如果用户对象可以将userDetail标识为级联对象以合并/持久化,那么userDetail不应该将用户识别为父/所有者吗?不,因为双向关系不是这样工作的。只有拥有方(没有映射的一方)可以级联到另一方。其他选项包括不将生成器用于userDetail的密钥,或使用
@Embedded