更新父实体时使用@OneToOne单向映射时出现问题:child'未持久化

时间:2012-12-12 14:14:13

标签: spring hibernate jpa

我有一个简单的父/子用例,让我很难让它运行正常。 问题是保存操作按预期工作但似乎没有更新。

家长班:

@Entity
public class Parent {

 private Long id;


 private Fils fils;

 @Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 public Long getId() {
     return id;
 }


 public void setId( Long id ) {
     this.id = id;
 }

 @OneToOne(cascade=CascadeType.ALL, orphanRemoval=true)
 @JoinColumn(name="fils_fk")
 public Fils getFils() {
     return fils;
 }


 public void setFils( Fils fils ) {
     this.fils = fils;
 }    
}

儿童班:

@Entity
public class Fils {

 private Long id;    

 @Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 public Long getId() {
     return id;
 }

 public void setId( Long id ) {
     this.id = id;
 }

}

测试类:

@Test
public void testSave(){
    Parent p = new Parent();
    p.setFils( new Fils() );
    dao.save( p );
    Assert.assertNotNull( p.getFils().getId() );
    dao.delete( p );
}

@Test
public void testUpdate(){
    Parent p = new Parent();
    dao.save( p );
    Fils f = new Fils();
    p.setFils( f );
    dao.update( p );
    Assert.assertNotNull( p.getFils().getId() );
}

首先保存Fils对象,然后保存Pere对象,一切都很好,但更新仅保留Pere对象。

感谢您提供的任何帮助。

尼古拉斯

PS:

Grrrr问题解决了......

事实上,我在ParentDao中使用此代码来执行更新:

public Parent update(Parent p){
    sessionFactory.getCurrentSession().update( p );
    return (Parent)sessionFactory.getCurrentSession().load( Parent.class, p.getId() );
}

用以下代码替换此代码段:

public Parent update(Parent p){
    sessionFactory.getCurrentSession().persist( p );
    return (Parent)sessionFactory.getCurrentSession().load( Parent.class, p.getId() );
}

并且tadam更新工作级联子实体持久性。

我会回到文档检查它但我从来没有读过你不能使用更新并获得级联操作...

最好的问候。

1 个答案:

答案 0 :(得分:0)

OP解决方案。

问题解决了。

在ParentDao中替换代码段以执行以下更新:

public Parent update(Parent p){
    sessionFactory.getCurrentSession().persist( p );
    return (Parent)sessionFactory.getCurrentSession().load( Parent.class, p.getId() );
}

塔达姆会更新级联的子实体持久性工作。

我从不会读到您不能使用update来级联此操作。