HQL将关联从许多映射删除



我有两个实体crimAgeType&可与许多与许多关系的关系如下:

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表。

我想要

的sql查询的HQL等效
delete from imageviewer_imtype_variable where ImTypeId='%%%'

这是JPA,而不是特定的Hibernate。如果您在API的上下文而不是实现的上下文中搜索,则在此处的顶部有标准化的API,因此更容易找到答案。

做到这一点的方法(据我所知,我不经常使用很多关系)是从彼此的集合映射字段中删除相关实体。因此,如果您具有EntityA和EntityB,则将EntityA从EntityB和EntityB中删除。然后应触发持久性提供者以从联接表中删除记录。

本地查询只能是最后一个imo。

  • 您可以执行本机SQL查询:

http://docs.jboss.org/hibernate/Orm/4.1/manual/en-en-us/html/ch18.html#querysysql-creating

因此,在您的情况下,类似:

session.createSQLQuery("DELETE FROM imageviewer_imtype_variable").executeUpdate();
  • 您还可以在 CrImageType entity中指定自定义的本机SQL删除查询:

http://docs.jboss.org/hibernate/orm/4.1/manual/en-en-us/html/ch18.html#querysysql-cud-cud

根据我的经验,处理ManyTomany关系是少数情况下,摆脱Orm Integrism是我们脑海中的最佳选择。特别是,当您使用两种方式导航时(即当关系和逆关系有用时)。

@gimby在他的回答中是正确的,事情是,有一个复杂的十字架引用,使它起作用要比进行简单的本地查询要困难得多。

so:

session.createSQLQuery("DELETE FROM imageviewer_imtype_variable").executeUpdate();

很容易,如果它仍然因为交叉引用而无法工作,您甚至会添加一个:

session.clear();

好的。这是另一个ORM Integrism侵权,但要使您以两行脱离污水库;-)。

@gimby的答案是正确的,在许多与许多关系中,从彼此中删除相关实例映射集合触发了从关系映射表中删除的删除。

在实体类CRVARAIP中,您可以添加:

@PreRemove
private void removeCRVariableFromCRImageType() {
    for (CRImageType crImageType: CRImageType) {
        crImageType.getCrvariables ().remove(this);
    }
}

此方法将覆盖JPA操作预先启动,以便从集合CRVARIABLES中删除可删除的可crvaraible对象(从技术上讲,Table ImageViewer_imtype_variable)

希望这对您有帮助!

最新更新