我有两个实体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)
希望这对您有帮助!