簡體   English   中英

HQL從多對多的映射中刪除關聯

[英]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的最后手段。

  • 您可以執行本機SQL查詢:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM