Я использую JPA через Play Framework.JPA EntityManager: merge() пытается создать новую строку в db - почему?
Я проверяю, чтобы увидеть, если объект пользователя в кэше, и если да, я получить его и слейте() это такое, что я могу обновить поля и сохраните изменения позже:
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'
похоже, что ее пытаются вставить новый пользователь, даже если этот пользователь должен быть, и уже есть в базе данных. Зачем сливать() делать это?
Или, возможно, я собираюсь сделать это совершенно неправильно - совет будет оценен.
Является ли 'authToken' первичным ключом? – axtavt
Не первичный ключ, но есть уникальное ограничение на него – sanity
@sanity - в следующий раз, когда у вас есть проблема с гибернацией, возможно, стоит упомянуть этот факт. JPA - это интерфейс, проблема с реализацией Hibernate. Несколько подробностей относительно определения сущности не повредят - см. Ниже мой ответ, который идентифицирует вероятную причину вашей проблемы. –