如何知道持久化方法是否有效?我只能考虑两个解决方案,但肯定有一些更直接或准备这个。无论如何,我想知道是否有人知道这个解决方案的问题或更好的选择?感谢?
当我使用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();
答案 0 :(得分:1)
详情请参阅JPA 2.1规范。
关于contains()
方法:
3.2.8受管实例
contains()
方法可用于确定是否在当前持久性上下文中管理实体实例。 contains方法返回true:
- 如果已从数据库中检索实体或已由
getReference
返回实体,且尚未删除或分离实体。- 如果实体实例是新的,并且已在实体上调用了persist方法,或者
persist
操作已经级联到它。
关于persist()
方法:
3.2.2持久化实体
通过在其上调用persist方法或级联持久化操作,新的实体实例变为托管和持久实体。
引号中有一个直接的答案。
3.2.2持久化实体
...
- 如果X是一个分离的对象,则在调用持久化操作时可能会抛出
EntityExistsException
,或者在刷新或提交时可能抛出EntityExistsException
或另一个PersistenceException
。 / LI>...
因此,请考虑使用以下«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了解更多信息