QueryDSL,Hibernate删除子表行删除父表行

时间:2013-04-09 02:18:06

标签: java hibernate jpa querydsl

我正在尝试删除父表行并观察它是否在子表行上级联(删除)。 带有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对象一样,插入Parent表和Child表行。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

不幸的是,JPQL中的DELETE子句不会级联到相关实体,因此您需要使用API​​进行级联删除或更新:

A delete operation only applies to entities of the specified class and its subclasses. 
It does not cascade to related entities.

答案 1 :(得分:0)

回答我的问题,删除父表行时删除子表行。

父表对象到getChildTableSet的映射:

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

ChildTable列的子表对象的映射:

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

getter和setter方法的其余部分保持不变,两个Parent-Child表的ID都是自动生成的,只要取映射,其余的就可以了。