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

EntityManager在persist之后包含或查找byid,以了解persist方法是否有效

  •  0
  • Genaut  · 技术社区  · 7 年前

    persist 我没有返回来检查方法是否成功完成。(可以是布尔值或实体本身来检查id)

    UserEntity e = new UserEntity();
    e.setName("Name");
    e.setAge(30);
    em.persist(e);
    

    选项#1 EntityManger包含方法 http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#contains

    UserEntity e = new UserEntity();
    e.setName("Name");
    e.setAge(30);
    em.persist(e);
    ----
    return em.contains(e);
    

    选项2返回实体ID 当我坚持实体时,我可以 commit

    UserEntity e = new UserEntity();
    e.setName("Name");
    e.setAge(30);
    em.persist(e);
    em.commit();
    ----
    return e;//or return e.getId();
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Harish Barma    7 年前

    对于选项1: em.contains(e) 只检查实体是否处于持久性上下文的托管状态,而与结果无关,因此这只是检查实体是否处于托管状态

    但是,一旦实体处于托管状态并被持久化,实体将使用数据库中的数据进行更新,因此仅返回实体就足够了。

    如果您真的想刷新数据,而不是jpa自己处理数据,请调用 em.flush()

    em.persist(e);
    em.flush();   //not really required 
    return e; //this will return the object that is already persisted in the database
    

    检查 entity life cycle

        2
  •  1
  •   Sergey Vyacheslavovich Brunov prodigitalson    7 年前

    有关详细信息,请参阅JPA 2.1规范。

    关于 contains() 方法:

    3.2.8托管实例

    这个 方法可用于确定是否在当前持久性上下文中管理实体实例。contains方法返回true:

    • getReference ,并且尚未移除或分离。
    • 如果实体实例是新的,并且已对实体或 persist

    JSR 338: Java™ Persistence 2.1, Final Release

    persist() 方法:

    3.2.2持久化实体实例

    通过调用新实体实例上的persist方法或级联persist操作,新实体实例既可以被管理也可以被持久化。

    JSR 338:Java Persistence 2.1最终版本 ,第81页。

    引用中有一个直接的答案。

    选项#2

    3.2.2持久化实体实例

    • 如果X是分离的对象,则 EntityExistsException 实体存在性异常 或者其他 PersistenceException

    ,第81页。

    因此,考虑使用 以下手动(即显式)方法调用:

    • 这个 entityManager.flush(); 方法调用。
    • entityManager.getTransaction().commit(); 方法调用。

    另外,请参考问题: JPA - Returning an auto generated id after persist()