org.hibernate.PersistentObjectException: detached entity passed to persist
Ошибка:
org.hibernate.PersistentObjectException: detached entity passed to persist
Пример, когда может возникать этот эксепшн:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
@Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) // commented for manually set the id private long id; @Column(name = "login", unique = true, updatable = false) private String name; //Important to Hibernate! @SuppressWarnings("MySQLConfig") public UsersDataSet() { } @SuppressWarnings("MySQLConfig") public UsersDataSet(long id, String name) { this.setId(id); this.setName(name); } public UsersDataSet(String name) { this.setId(-1); this.setName(name); } |
Если не убрать строчку выбора стратегии создания id в автоматическом режиме, то возникнет вышеописанное исключение.
1 |
@GeneratedValue(strategy = GenerationType.IDENTITY) |
Причина заключается в том, что запись выше указывает JPA стратегию автоматического создания идентификатора при сохранении (создании) сущности. Однаков в конструкторе уже прописано, что нужно вставить идентификатор вручную. В результате, т.к. индентификатор назначается вручную в конструкторе и отсутствует, то JPA думает, что сохраняется объект, отсутствующий в контексте персистентности (detached from persistence context).
Для исправления либо убирайте в констркуторе указание id, либо убирайте GeneratedValue(strategy = …)
1 2 3 4 |
public UsersDataSet(long id, String name) { // this.setId(id); this.setName(name); } |
13