[英]HQL delete associations from many to many mapping
我有兩個實體CRImageType和CRVariable具有多對多關系,如下所示:
CRImageType實體:
@Entity
@Table(name = "imageviewer_crimagetype")
public class CRImageType implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name = "ImTypeId")
private Long imTypeId;
@Column(name = "ImTypeName")
private String imTypeName;
@Column(name = "ImTypeDescription")
private String imTypeDescription;
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="imageviewer_imtype_variable",
joinColumns={@JoinColumn(name="ImTypeId")},
inverseJoinColumns={@JoinColumn(name="VarId")})
private Set<CRVariable> crvariables = new HashSet<CRVariable>();
CRVariable實體:
@Entity
@Table(name = "imageviewer_crvariable")
public class CRVariable implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name = "VarId")
private Long varId;
@Column(name = "VarName")
private String varName;
@Column(name = "VarDescription")
private String varDescription;
@ManyToMany(mappedBy="crvariables")
private Set<CRImageType> crimagetypes = new HashSet<CRImageType>();
在我的數據庫中,關系由兩個表“imageviewer_crimagetype”和“imageviewer_crvariable”以及第三個“imageviewer_imtype_variable”映射,用於它們的多對多關系。
我只想刪除表“imageviewer_imtype_variable”中的關聯記錄。 如何使用HQL查詢來完成,因為我無法直接訪問“imageviewer_imtype_variable表”。
我希望HQL等同於SQL查詢
delete from imageviewer_imtype_variable where ImTypeId='%%%'
這是JPA,而不是Hibernate。 如果您在API的上下文中搜索而不是實現,那么您在此處擁有標准化API的事實可以更輕松地找到答案。
這樣做的方法(據我記得,我不經常使用多對多關系)是從彼此的集合映射字段中刪除相關實體。 因此,如果您有EntityA和EntityB,則從EntityA中刪除EntityA,從EntityA中刪除EntityB。 然后應觸發持久性提供程序以從連接表中刪除記錄。
原生查詢應該只是IMO的最后手段。
http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch18.html#querysql-creating
所以在你的情況下,像:
session.createSQLQuery("DELETE FROM imageviewer_imtype_variable").executeUpdate();
CrImageType
實體中指定自定義本機SQL DELETE查詢: http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch18.html#querysql-cud
根據我的經驗,處理ManyToMany關系是為數不多的情況之一,為了我們的想法,退出ORM整合是最好的選擇。 特別是,當您使用雙向導航時(即當關系和反向關系有用時)。
@Gimby在他的回答中是正確的,事實是,使用復雜的交叉引用它比使用簡單的本機查詢要困難得多。
所以:
session.createSQLQuery("DELETE FROM imageviewer_imtype_variable").executeUpdate();
更容易,如果由於交叉引用它仍然不起作用,你甚至添加一個:
session.clear();
好。 這是另一個ORM整合侵權,但讓你從兩行中脫離了cesspit ;-)。
@Gimby的答案是正確的,在多對多的關系中,相互之間刪除相關的實例,映射集合觸發從關系映射表中刪除。
在實體類CRVariable中,您添加:
@PreRemove
private void removeCRVariableFromCRImageType() {
for (CRImageType crImageType: CRImageType) {
crImageType.getCrvariables ().remove(this);
}
}
此方法將覆蓋JPA操作PreRemove,以便分離要從set crvariables中刪除的CRVariable對象(從技術上講,表imageviewer_imtype_variable)
希望這對你有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.