有一个类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已正确设置。
答案 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 将尝试插入它们。