JPA、scope和autosave?
我正在使用JPA,假设我做了这样的事情JPA、scope和autosave?,jpa,Jpa,我正在使用JPA,假设我做了这样的事情 public class MoRun extends Thread {... public void run() { final EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("pu"); EntityManager manager = emFactory.createEntityManager(); manager.setFlushM
public class MoRun extends Thread {...
public void run() {
final EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("pu");
EntityManager manager = emFactory.createEntityManager();
manager.setFlushMode(FlushModeType.COMMIT);
someMethod(manager);
...
}
public void someMethod(EntityManager manager){
Query query = manager.createNamedQuery("byStates");
List<State> list = query.getResultList();
for (State state : list) {
if(someTest)
state.setValue(...)
}
...
}
公共类MoRun扩展线程{。。。
公开募捐{
最终EntityManagerFactory emFactory=Persistence.createEntityManagerFactory(“pu”);
EntityManager=emFactory.createEntityManager();
setFlushMode(FlushModeType.COMMIT);
管理者;
...
}
公共方法(EntityManager管理器){
Query Query=manager.createNamedQuery(“byStates”);
List=query.getResultList();
用于(状态:列表){
如果(某些测试)
state.setValue(…)
}
...
}
因此,对于那些通过“someTest”并更新了值的对象,即使没有事务,并且我没有显式地“manager.save(state)”,这些更改也会自动保留到数据库中对象?我问是因为它看起来像是,我想知道刷新是否在做它?你怎么知道没有事务?你是从EJB使用它吗?在这种情况下,我打赌有事务 从文档(): 如果设置了FlushModeType.COMMIT,则 对中的实体进行更新的效果 查询时的持久性上下文 没有具体说明 如果没有活动的事务,则 持久性提供程序不能刷新到 数据库
如果您在事务中,附加的实体(即在同一事务中加载的实体)将自动记录到数据库。您如何知道没有事务?您是从EJB使用它的?在这种情况下,我打赌有事务 从文档(): 如果设置了FlushModeType.COMMIT,则 对中的实体进行更新的效果 查询时的持久性上下文 没有具体说明 如果没有活动的事务,则 持久性提供程序不能刷新到 数据库
如果您在事务中,附加的实体(即在同一事务中加载的实体)将自动记录到数据库。根据的javadoc(我假设这是JPA 1.0问题),正如@Konrad所指出的: 如果没有活动的事务,则持久性提供程序不得刷新到数据库 由于您很可能使用
transaction type=“RESOURCE\u LOCAL”
作为持久化单元,因为我没有看到任何begin
/commit
围绕您对EntityManager
的调用(这不好,稍后会有更多介绍),对我来说,没有激活的事务,因此我不希望刷新任何内容
无论如何,正如尼斯页面中提醒的:
- 使用
您负责
(PersistenceContext/Cache)创建 和跟踪。。。EntityManager
- 您必须使用 要获得 实体管理器
- 结果
实例是一个 PersistenceContext/CacheEntityManager
- 一个
可以通过EntityManagerFactory
仅注释(非@PersistenceContext)@PersistenceUnit
- 你是 不允许使用@PersistenceContext引用单元 类型为RESOURCE\u LOCAL
- 你
必须使用
API开始/提交对您的 全部愤怒EntityTransaction
- 召唤
两次会导致两次EntityManager工厂。createEntityManager()
- 是的 几乎从来都不拥有一个以上的实例是个好主意 EntityManager正在使用中(不创建 第二个,除非你已经摧毁了 (一)
因此,在我看来,您应该在这里修复您的代码,如果您的代码不正确,那么怀疑意外行为没有真正的意义。只需在事务内部调用您的
EntityManager
。根据的javadoc(我假设这是一个JPA1.0问题),正如@Konrad所指出的:
如果没有活动的事务,则持久性提供程序不得刷新到数据库
由于您很可能使用transaction type=“RESOURCE\u LOCAL”
作为持久化单元,因为我没有看到任何begin
/commit
围绕您对EntityManager
的调用(这不好,稍后会有更多介绍),对我来说,没有激活的事务,因此我不希望刷新任何内容
无论如何,正如尼斯页面中提醒的:
- 使用
您负责
(PersistenceContext/Cache)创建 和跟踪。。。EntityManager
- 您必须使用 要获得 实体管理器
- 结果
实例是一个 PersistenceContext/CacheEntityManager
- 一个
可以通过EntityManagerFactory
仅注释(非@PersistenceContext)@PersistenceUnit
- 你是 不允许使用@PersistenceContext引用单元 类型为RESOURCE\u LOCAL
- 你
必须使用
API开始/提交对您的 全部愤怒EntityTransaction
- 召唤
两次会导致两次EntityManager工厂。createEntityManager()
- 是的 几乎从来都不拥有一个以上的实例是个好主意 EntityManager正在使用中(不创建 第二个,除非你已经摧毁了 (一)