3

有一个 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 以免重复 B。saveOrUpdate 会解决问题吗?或者它只是通过查看A来决定选择保存还是更新,例如如果A是新的,它也会在Bs上调用save,如果A是旧的,它也会在Bs上调用update?

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

问候

更新:在旧 B 的情况下,旧 B 的实例附加到会话,并且 DBId 设置正确。

4

1 回答 1

2

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

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

于 2013-06-04T22:36:43.953 回答