来自Java持久化的Hibernate (Manning,2007),第419页:
我应该在会话中使用持久性()吗?Hibernate会话接口还提供了一个持久化()方法。它具有与JPA的持久化()操作相同的语义。然而,这两项行动在冲洗方面有一个重要的区别。在同步过程中,Hibernate会话不会将持久化()操作级联到关联的实体和集合,即使您用此选项映射了关联。--只有在调用persist()!时才能到达的实体才会级联,如果使用会话API,则只在刷新时级联保存()(和update())。然而,在一个JPA应用程序中,情况正好相反:只在齐平时层叠在一起。
如此难以辨认的措辞..。什么是“当您调用持久性()时可以访问的实体”?
如果我更新了一个关联的实体,那么它不应该是“可访问的”吗?
还有..。如果它是session.persist()行为的一部分,那么为什么它不在javadoc中?
发布于 2014-07-07 19:51:09
我真的不知道这是不是真的,但我至少可以解释一下这意味着什么。
假设您有以下实体:
public class Order {
@OneToMany(cascade = PERSIST)
private List<OrderLine> lines;
// ...
}你做了以下事情:
Order order = new Order();
session.persist(order);
OrderLine line = new OrderLine();
order.addLine(line);
session.flush(); // the flush could also be called implicitely, when committing or executing a query根据问题中的文本,行将不会持久化,因为在调用persist(order)时,从顺序中无法到达该行:此时,该行还没有按顺序排列。
另一方面,您是否使用实体管理器:
Order order = new Order();
em.persist(order);
OrderLine line = new OrderLine();
order.addLine(line);
em.flush(); // the flush could also be called implicitely, when committing or executing a query然后行将被持久化,因为当实体的状态被同步到数据库时,它可以从刷新时的顺序到达。
发布于 2014-07-07 20:51:57
Hibernate的EntityManager实现是:
org\hibernate\hibernate-entitymanager\4.3.5.Final\hibernate-entitymanager-4.3.5.Final-sources.jar!\org\hibernate\jpa\spi\AbstractEntityManagerImpl.java这是persist()方法。
@Override
public void persist(Object entity) {
checkOpen();
try {
internalGetSession().persist( entity );
}
catch ( MappingException e ) {
throw convert( new IllegalArgumentException( e.getMessage() ) ) ;
}
catch ( RuntimeException e ) {
throw convert( e );
}
}所以JPA持久化(实体)实际上是在调用org.hibernate.internal.Session.persist(entity).
因此,在持久化实体方面,JPA和Hibernate之间不应该有任何区别。
它只被级联到那些在您调用持久性()时可以到达的实体!
2007年,Hibernate 3.2已经发布,3.3版已经发布。那时的JPA只是一份草案
您还可以使用EJB3 >>>早期的草案中定义的语义,而不是保存()。
但根据医生的说法:
如果传递一个父级来持久化(),那么所有的子级都会被传递到持久性()
对于JPA来说,级联持久性()是有意义的,因为根本没有save()操作。但是,当时人们使用的是saveOrUpadet()、saveOrUpdateCopy(),甚至是saveOrUpdateCopy(),它们被弃用而倾向于持久化()和合并()。
当时,持久化的JPA定义只是一个草案,所以特定的实现并没有反映出一个明确的特性。
https://stackoverflow.com/questions/24617311
复制相似问题