QueryDSL, Hibernate удалить строку дочерней таблицы при удалении строки родительской таблицы

Я пытаюсь удалить строку родительской таблицы и наблюдаю, каскадируется ли она (удаляется) в строках дочерней таблицы. Объект родительской и дочерней таблиц с аннотациями java:

//Table details
@Entity
@Table(name="PARENT_TABLE")
//Mandatory Column details
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="PARENT_TABLE_ID")
private Integer id;
.
.
.
@OneToMany(cascade={CascadeType.ALL}, mappedBy = "parentTable")
private Set<ChildTable> setChildTable;
//Child table entity details:
@Entity
@Table(name = "CHILD_TABLE")
//Column details
@Id
@Column(name = "PARENT_TABLE_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
.
.
private ParentTable parentTable;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "PARENT_TABLE_ID")
public ParentTable getPatentTable() {
   return parentTable;
}

 //QueryDSL to Delete child table row, looks like this:
HibernateDeleteClause query = new HibernateDeleteClause(getSession(),QChildTable.childTable);
Path<?> idPath = QChildTable.childTable;
 query.where(((NumberPath<?>)idPath).in((Number[]) ids)).execute();
 //QueryDSL to Delete parent table rows, looks like this:
HibernateDeleteClause query = new HibernateDeleteClause(getSession(),QParentTable.parentTable);
Path<?> idPath = QParentTable.parentTable;
 query.where(((NumberPath<?>)idPath).in((Number[]) ids)).execute();

Если я удалю дочерний элемент, а затем попытаюсь удалить строки родительской таблицы, он будет работать нормально. Нужна помощь, чтобы удалить строки родительской и дочерней таблиц одновременно, как работает вставка. Подобно созданию объекта ParentTable, присваивающего данные и вставляющего , вставляется как строки родительской таблицы, так и строки дочерней таблицы. Спасибо за помощь.


person man.2067067    schedule 09.04.2013    source источник
comment
Добавлен атрибут orphanRemoval = true для сопоставления «один ко многим», как показано ниже: @OneToMany(cascade={CascadeType.ALL}, mappedBy = "parentTable",orphanRemoval = true), но не помогает   -  person man.2067067    schedule 09.04.2013
comment
Получение приведенного ниже исключения с атрибутом каскада и без него для дочерней таблицы: @ManyToOne(cascade=CascadeType.ALL) ИЛИ @ManyToOne Исключение в потоке main org.hibernate.exception.ConstraintViolationException: ОШИБКА: обновление или удаление в таблице PARENT_TABLE нарушает ограничение внешнего ключа fk7dfcef12c1324147 в таблице CHILD_TABLE Деталь: ключ (PARENT_TABLE_ID) =(1065) по-прежнему ссылается на таблицу CHILD_TABLE.   -  person man.2067067    schedule 09.04.2013


Ответы (2)


К сожалению, предложения DELETE в JPQL не каскадируются на связанные объекты, поэтому вам нужно будет использовать API для каскадного удаления или обновления:

A delete operation only applies to entities of the specified class and its subclasses. 
It does not cascade to related entities.
person Timo Westkämper    schedule 09.04.2013
comment
Спасибо за ответ Тимо. - person man.2067067; 10.04.2013

Отвечая на мой вопрос об удалении строк дочерней таблицы при удалении строки родительской таблицы.

Сопоставление объекта родительской таблицы с getChildTableSet:

@OneToMany(cascade = { CascadeType.ALL }, mappedBy = "parentTable", orphanRemoval = true)
public Set<ChildTable> getSetChildTable() {
    return setChildTable;
}

Сопоставление объекта дочерней таблицы для столбца ParentTable:

@ManyToOne
@JoinColumn(name = "PARENT_TABLE_ID")
public ParentTable getParentTable() {
    return parentTable;
}

Остальные методы получения и установки остаются прежними, идентификаторы обеих родительско-дочерних таблиц генерируются автоматически, просто возьмите сопоставления, остальные должны работать нормально.

person man.2067067    schedule 23.05.2013