休眠保存/更新级联

时间:2013-06-04 08:22:19

标签: java hibernate orm

有一个类A:

class A {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Basic(optional = false)
     @Column(name = "DBId")
     private Long DBId = null;

     @OneToMany(cascade = CascadeType.ALL)
     @LazyCollection(LazyCollectionOption.FALSE)
     List<B> list;
}

和B类一样

class B {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Basic(optional = false)
     @Column(name = "DBId")
     private Long DBId = null;
}

当我想要持久化A类的新实例时,有两种情况是可能的。 1- A中B的所有实例都是新的,在这种情况下,一个简单的session.save(A)就可以了。 2- A中B的部分或全部实例都是旧的。如何保存A以便不会有重复的Bs。 saveOrUpdate会解决问题吗?或者只是通过查看A来决定选择保存或更新,例如,如果A是新的,它还会调用B上的保存,如果A是旧的,它还会调用B上的更新?

此外,我看到我的代码中只有一个简单的session.save(A),并且它没有产生冗余的Bs。我错了吗?这可能吗?

此致

UPDATE:如果是旧B,旧B的实例会附加到会话中,并且DBId已正确设置。

1 个答案:

答案 0 :(得分:2)

您的实体比会话更长寿吗?如果没有,则您不必使用update()saveOrUpdate()。当您调用session.save()时,Hibernate通过检查实体的状态来了解是insert还是update。您可以在此处阅读有关州的更多信息:http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#objectstate-overview

同样适用于级联。当操作级联到集合时,Hibernate将检查集合中实体的状态,如果它们已处于PERSISTENT状态, NOT 将尝试插入它们。