我正在通过Play框架使用JPA。
我正在检查是否缓存了User对象,如果是,我将其检索并merge()以便可以更新字段并在以后保存更改:
user = (User) Cache.get("user-auth-" + sessionAuthToken);
if (user != null) {
user = user.merge(); // I believe this is the same as EntityManager.merge()
}
但是,当我这样做时,出现以下错误:
PersistenceException occured :
org.hibernate.exception.ConstraintViolationException:
could not insert: [models.User]
...
Caused by: com.mysql.jdbc.exceptions.jdbc4.
MySQLIntegrityConstraintViolationException:
Duplicate entry '1235411688335416533' for key 'authToken'
似乎它试图插入一个新用户,即使该用户应该已经并且已经在数据库中。为什么merge()会这样做?
或者,也许我正在以完全错误的方式进行操作-建议将不胜感激。
我相信您的问题是Play管理JPA环境(和交易)的方式。
收到请求后,框架立即创建JPA管理器和事务。从那时起,您的所有Model实体都会自动链接到管理器。
Play可通过以下两种方式促进使用此模型:
通过运行“合并”,您试图将已存在的实体添加到Manager中,这会导致唯一键异常。如果您只是从缓存中加载实体,则完成后便可以修改并调用save(),它将起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句