代码之家  ›  专栏  ›  技术社区  ›  arinte

JPA、scope和autosave?

jpa
  •  1
  • arinte  · 技术社区  · 15 年前

    我正在使用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(...)
        }
    ...
    }
    

    因此,对于那些通过“someTest”并更新了值的对象,即使没有事务并且我没有显式地“manager.save(state)”对象,这些更改是否也会自动保留到db中?我问是因为它看起来像是,我想知道是否冲水是这样做的?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Pascal Thivent    15 年前

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

    因为你很可能会使用 transaction-type="RESOURCE_LOCAL" 你的持久性单位,因为我没有看到任何 begin / commit 围绕着你的电话 EntityManager

    不管怎样,就像《尼斯》里提到的那样 JPA Concepts 页码:

    • <persistence-unit transaction-type="RESOURCE_LOCAL"> 实体管理器 (PersistenceContext/Cache)创建 跟踪。。。
      • 必须 使用 获得 实体管理器
      • 实体管理器 实例是
      • EntityManagerFactory 可以通过 @PersistenceUnit 仅注释(不是@PersistenceContext)
      • 允许使用@PersistenceContext引用单元 资源类型\本地
      • 必须 使用 EntityTransaction API开始/提交对 整体愤怒
      • entityManagerFactory.createEntityManager() 两次结果 分离 单独的PersistenceContext/缓存。
      • 几乎从来没有 一个 EntityManager正在使用中(不要创建 第二个,除非你毁了 第一个)

    修理 实体管理器

        2
  •  0
  •   Konrad Garus    15 年前

    你怎么知道没有交易?您是从EJB使用它吗?那样的话,我打赌一定有交易。

    来自文档( http://java.sun.com/javaee/6/docs/api/javax/persistence/FlushModeType.html ):

    如果设置了FlushModeType.COMMIT,则 对中的实体进行更新的效果 未指定。

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

    如果您在事务中,附加的实体(即在同一事务中加载的实体)将自动记录到数据库中。