Почему Hibernate пытается удалить, когда я пытаюсь обновить / вставить?
В моем приложении у меня есть эти типы, отображаемые в Hibernate (общий случай):
class RoleRule {
private Role role;
private PermissionAwareEntity entity; // hibernate-mapped entity for which permission is granted
private PermissionType permissionType; // enum
@ManyToOne
@JoinColumn(name = "ROLE_ID")
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
class Role {
private Set rules = new HashSet(0);
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="ROLE_ID")
public Set getRules() {
return rules;
}
public void setRules(Set rules) {
this.rules = rules;
}
}
Все классы имеютequals() & hashCode()
переопределение.
Мое приложение позволяет изменять роли (только для системных администраторов, неt беспокойство), и среди других областей, позволяет создавать новые правила ролей. Когда создается новое правило, я пытаюсь создать новоеRoleRule
объект и вставить его в рольполе сrules
, Я звонюsession.update(role)
применить изменения к базе данных.
Теперь наступает ужасная часть ... Hibernate решает сделать следующее при закрытии транзакции и сбросе:
Вставьте новое правило в базу данных. Отлично.Обновите другие поля роли (не коллекции). Все идет нормально.Обновите существующие правила, даже если в них ничего не изменилось. Я могу жить с этим.Обновите существующие правиласнова, Вот's вставка из журнала, включая автоматический комментарий:/* delete one-to-many row Role.rules */ update ROLE_RULE set ROLE_ID=null where ROLE_ID=? and ROLE_RULE_ID=?
Конечно, все поля не равны NULL, и эта операция завершается неудачно.
Может кто-нибудь попытаться объяснить, почему Hibernate сделал бы это ??? И даже более важно, как я могу обойти это?
РЕДАКТИРОВАТЬЯ был уверен, что это как-то связано с картированием, а потом мой босс по прихоти удалилequals()
а такжеhashCode()
в обоих классах воссоздали их с помощью Eclipse, и загадочным образом это решило проблему.
Мне все еще очень любопытно по поводу моего вопроса. Кто-нибудь может подсказать, почему Hibernate сделал бы это?