EntityManager在持久化后包含或findById,以了解persist方法是否有效

时间:2017-08-02 16:01:01

标签: java jpa

如何知道持久化方法是否有效?我只能考虑两个解决方案,但肯定有一些更直接或准备这个。无论如何,我想知道是否有人知道这个解决方案的问题或更好的选择?感谢?

当我使用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并返回实体或实体ID,如果我有id,则持久化方法应该成功。

UserEntity e = new UserEntity();
e.setName("Name");
e.setAge(30);
em.persist(e);
em.commit();
----
return e;//or return e.getId();

2 个答案:

答案 0 :(得分:1)

详情请参阅JPA 2.1规范。

选项#1

关于contains()方法:

  

3.2.8受管实例

     

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

     
      
  • 如果已从数据库中检索实体或已由getReference返回实体,且尚未删除或分离实体。
  •   
  • 如果实体实例是新的,并且已在实体上调用了persist方法,或者persist操作已经级联到它。
  •   
     

- JSR 338: Java™ Persistence 2.1, Final Release,第86页。

关于persist()方法:

  

3.2.2持久化实体

     

通过在其上调用persist方法或级联持久化操作,新的实体实例变为托管和持久实体。

     

- JSR 338: Java™ Persistence 2.1, Final Release,第81页。

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

选项#2

  

3.2.2持久化实体

     

...

     
      
  • 如果X是一个分离的对象,则在调用持久化操作时可能会抛出EntityExistsException,或者在刷新或提交时可能抛出EntityExistsException或另一个PersistenceException。 / LI>   
     

...

     

- JSR 338: Java™ Persistence 2.1, Final Release,第81页。

因此,请考虑使用以下«manual»(即显式)方法调用中的之一

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

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

答案 1 :(得分:1)

对于选项1: em.contains(e)仅检查实体是否处于持久化上下文的托管状态,而不检查结果,因此这只是检查实体是否在管理国家与否?

对于选项2:如果持久性失败,它将返回持久值或立即抛出异常。

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

  

如果你真的想要刷新数据而不是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了解更多信息