Я работаю со следующими отношениями родитель-ребенок:
@Entity
@Audited
public class Parent implements Serializable {
@Id
private Long id;
@OneToMany(mappedBy = "parent", cascade = {CascadeType.ALL}, orphanRemoval = true)
private Set<Child> children;
// Empty default constructor
// Getters and setters
}
@Entity
@Audited
public class Child implements Serializable {
@Id
private Long id;
@ManyToOne
@JoinColumn(nullable = false)
private Parent parent;
// Empty default constructor
// Getters and setters
}
Вариант использования, над которым я работаю, предусматривает удаление ребенка от его родителя, , но на данный момент я явно не должен объединять родительскую сущность.Поэтому я попытался сделать следующее:
Child childFromDb = entityManager.find(Child.class, child.getId());
childFromDb.setParent(null);
entityManager.remove();
Это приводит к java.sql.BatchUpdateException: (conn:1) Column 'parent_id' cannot be null
, генерируемому Hibernate.
Установка @JoinColumn(nullable = true)
решает эту проблему, но схема базы данных использует DEFAULT NULL
настолбец, который нежелателен, так как никакие объекты child
не могут существовать без связанных parent
.Кроме того, я не могу использовать оператор delete
в HQL, JPQL, нативном SQL или CriteriaDelete, поскольку таблицы проверяются с использованием Envers (5.1.4).Я помню, что Envers не поддерживает массовые операторы (вставка, обновление, удаление, https://hibernate.atlassian.net/browse/HHH-3554) или CriteraUpdate / CriteraDelete (https://hibernate.atlassian.net/browse/HHH-10318).
Как я могу удалить только child
без объединения parent
, сохраняя ограничение столбца NOT NULL
и не используя другой параметр удаления? Возможно ли это вообще?