JPA、scope和autosave?

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

我正在使用JPA,假设我做了这样的事情

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
的调用(这不好,稍后会有更多介绍),对我来说,没有激活的事务,因此我不希望刷新任何内容

无论如何,正如尼斯页面中提醒的:

  • 使用
    您负责
    EntityManager
    (PersistenceContext/Cache)创建 和跟踪。。。
    • 您必须使用 要获得 实体管理器
    • 结果
      EntityManager
      实例是一个 PersistenceContext/Cache
    • 一个
      EntityManagerFactory
      可以通过
      @PersistenceUnit
      仅注释(非@PersistenceContext)
    • 你是 不允许使用@PersistenceContext引用单元 类型为RESOURCE\u LOCAL
    • 必须使用
      EntityTransaction
      API开始/提交对您的 全部愤怒
    • 召唤
      EntityManager工厂。createEntityManager()
      两次会导致两次
      分离 EntityManager实例及其应用 两个独立的persistencecontext/cache
    • 是的 几乎从来都不拥有一个以上的实例是个好主意 EntityManager正在使用中(不创建 第二个,除非你已经摧毁了 (一)

因此,在我看来,您应该在这里修复您的代码,如果您的代码不正确,那么怀疑意外行为没有真正的意义。只需在事务内部调用您的
EntityManager

根据的javadoc(我假设这是一个JPA1.0问题),正如@Konrad所指出的:

如果没有活动的事务,则持久性提供程序不得刷新到数据库

由于您很可能使用
transaction type=“RESOURCE\u LOCAL”
作为持久化单元,因为我没有看到任何
begin
/
commit
围绕您对
EntityManager
的调用(这不好,稍后会有更多介绍),对我来说,没有激活的事务,因此我不希望刷新任何内容

无论如何,正如尼斯页面中提醒的:

  • 使用
    您负责
    EntityManager
    (PersistenceContext/Cache)创建 和跟踪。。。
    • 您必须使用 要获得 实体管理器
    • 结果
      EntityManager
      实例是一个 PersistenceContext/Cache
    • 一个
      EntityManagerFactory
      可以通过
      @PersistenceUnit
      仅注释(非@PersistenceContext)
    • 你是 不允许使用@PersistenceContext引用单元 类型为RESOURCE\u LOCAL
    • 必须使用
      EntityTransaction
      API开始/提交对您的 全部愤怒
    • 召唤
      EntityManager工厂。createEntityManager()
      两次会导致两次
      分离 EntityManager实例及其应用 两个独立的persistencecontext/cache
    • 是的 几乎从来都不拥有一个以上的实例是个好主意 EntityManager正在使用中(不创建 第二个,除非你已经摧毁了 (一)
因此,在m中