【发布时间】:2017-04-17 13:22:17
【问题描述】:
我正在阅读 JPA 2.1 规范并且有这个片段:
一个新的实体实例成为托管和持久的通过调用 其上的persist方法或级联persist操作。这 应用于实体 X 的持久操作的语义为 如下:...
是否可以在不显式调用persist() 方法的情况下调用persist 操作,或者persist 操作总是必须通过调用persist() 来触发?
假设我有两个实体 A 和 B,其中 A 与 B 有 OneToMany(cascade=PERSIST) 关系。
是
tx.begin();
A a = new A();
B b = new B();
a.getBCollection().add(b);
entityManager.persist(a);
tx.commit();
同:
tx.begin();
A a = new A();
entityManager.persist(a);
B b = new B();
a.getBCollection().add(b);
tx.commit();
在第二个例子中,B实体是否会被持久化(持久化操作将被级联),即使实体是在调用persist()方法后添加的?或者我必须在调用 persist() 方法之前将 B 实体添加到集合中,就像在第一个示例中那样,只有这样,persist 操作才会被级联?
那么#3 的例子有两个交易:
tx1.begin();
A a = new A();
entityManager.persist(a); //persist with key 1L
tx1.commit();
tx2.begin()
B b = new B();
A a = entityManager.find(A.class, 1L);
a.getBCollection().add(b);
tx2.commit();
第二个事务没有调用persist()方法,但是A处于托管状态,那么B实体会被持久化吗?
【问题讨论】: