JPA EntityManager:merge()试图在数据库中创建新行-为什么?

理智:

我正在通过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()会这样做?

或者,也许我正在以完全错误的方式进行操作-建议将不胜感激。

Pere Villega:

我相信您的问题是Play管理JPA环境(和交易)的方式。

收到请求后,框架立即创建JPA管理器和事务。从那时起,您的所有Model实体都会自动链接到管理器。

Play可通过以下两种方式促进使用此模型:

  • 您必须明确指出要保存对对象的更改(通过save())
  • 除非有异常或将其标记为回滚,否则将自动提交事务(JPA.setRollbackOnly())

通过运行“合并”,您试图将已存在的实体添加到Manager中,这会导致唯一键异常。如果您只是从缓存中加载实体,则完成后便可以修改并调用save(),它将起作用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

春季数据JPA查询返回重复的,而不是实际的数据行,为什么呢?

来自分类Java

为什么我们要使用@Modifying注释在数据JPA查询

来自分类Java

为什么@PreUpdate在JPA中的每个查询中运行?

来自分类Java

为什么JPA中的实体类不能定型?

来自分类Java

为什么在JPA中需要独立实体?

来自分类Java

JPA为什么使用createNamedQuery

来自分类Java

为什么JPA实体中的属性不允许“公开”?

来自分类Java

为什么Spring Boot JPA本机更新在postgres数据库中提供PSQLException?

来自分类Java

为什么我不能在JPA中删除该实体?

来自分类Dev

JPA EntityManager:为什么在merge()上使用persist()?

来自分类Dev

为什么要在数据库中创建视图?

来自分类Java

在JPA,关系数据库等中,什么是元组?

来自分类Java

Spring \ JPA \ PostgreSQL:为什么我得到未创建的表?

来自分类Dev

如何在JPA中创建序列而不直接在数据库中创建

来自分类Dev

JPA:为什么在关闭EntityManager时加载惰性字段

来自分类Dev

为什么在Spring Data JPA中的实体上存储过程元数据定义?

来自分类Dev

为什么要在数据库中插入JPA空值

来自分类Dev

为什么坚持使用JPA清除表行中的现有数据?

来自分类Dev

为什么即使使用BatchFetchType.IN提示,JPA / Eclipselink仍会触发冗余数据库查询?

来自分类Dev

JPA中的EntityManager merge()

来自分类Dev

为什么JPA \ Hibernate不自动创建此映射字段?

来自分类Dev

JPA:为什么在每个具体类中实现表是可选的?

来自分类Dev

为什么此代码在数据库中插入多个行?

来自分类Dev

persist()/ merge()在数据库中创建两行的原因可能是什么?

来自分类Dev

为什么同一数据库条目由多个JPA Bean实例表示?

来自分类Dev

JPA - 为什么使用@JoinColumn?

来自分类Dev

为什么 spring 数据 jpa 存储库仅强制接口?

来自分类Dev

为什么日期字段在 JPA 中带有字符 T

来自分类Dev

为什么 JPA 删除和创建选项不起作用

Related 相关文章

  1. 1

    春季数据JPA查询返回重复的,而不是实际的数据行,为什么呢?

  2. 2

    为什么我们要使用@Modifying注释在数据JPA查询

  3. 3

    为什么@PreUpdate在JPA中的每个查询中运行?

  4. 4

    为什么JPA中的实体类不能定型?

  5. 5

    为什么在JPA中需要独立实体?

  6. 6

    JPA为什么使用createNamedQuery

  7. 7

    为什么JPA实体中的属性不允许“公开”?

  8. 8

    为什么Spring Boot JPA本机更新在postgres数据库中提供PSQLException?

  9. 9

    为什么我不能在JPA中删除该实体?

  10. 10

    JPA EntityManager:为什么在merge()上使用persist()?

  11. 11

    为什么要在数据库中创建视图?

  12. 12

    在JPA,关系数据库等中,什么是元组?

  13. 13

    Spring \ JPA \ PostgreSQL:为什么我得到未创建的表?

  14. 14

    如何在JPA中创建序列而不直接在数据库中创建

  15. 15

    JPA:为什么在关闭EntityManager时加载惰性字段

  16. 16

    为什么在Spring Data JPA中的实体上存储过程元数据定义?

  17. 17

    为什么要在数据库中插入JPA空值

  18. 18

    为什么坚持使用JPA清除表行中的现有数据?

  19. 19

    为什么即使使用BatchFetchType.IN提示,JPA / Eclipselink仍会触发冗余数据库查询?

  20. 20

    JPA中的EntityManager merge()

  21. 21

    为什么JPA \ Hibernate不自动创建此映射字段?

  22. 22

    JPA:为什么在每个具体类中实现表是可选的?

  23. 23

    为什么此代码在数据库中插入多个行?

  24. 24

    persist()/ merge()在数据库中创建两行的原因可能是什么?

  25. 25

    为什么同一数据库条目由多个JPA Bean实例表示?

  26. 26

    JPA - 为什么使用@JoinColumn?

  27. 27

    为什么 spring 数据 jpa 存储库仅强制接口?

  28. 28

    为什么日期字段在 JPA 中带有字符 T

  29. 29

    为什么 JPA 删除和创建选项不起作用

热门标签

归档