我有2个Java类,一个名为Definition
,一个名为Classification
。
定义有一个分类列表,因此0..n
基数。
以下是我的对象关系映射:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.myPackage.Definition" table="definition">
<id name="id" column="ID" type="java.lang.Long">
<generator class="increment" />
</id>
<!-- definition will have many to many asscoiations with Classes -->
<set name="classes" table="class_definition" cascade="save-update">
<key column="definition_id" />
<many-to-many column="class_id" class="com.myPackage.Classification" foreign-key="fk_class_definition" />
</set>
</class>
</hibernate-mapping>
我现在要做的是删除定义和分类之间的关系。例如,定义X具有分类A,B和C,我想删除经典C的链接。
我知道如何在HQL中编写删除查询以删除类的对象。但我不知道如何删除班级属性的值。
有人可以建议吗?
答案 0 :(得分:2)
从上面的问题中,我发现解决方案的数据建模存在问题。 根据上述设计,定义对象可以包含多个分类对象。并且,由于两个实体之间存在多对多关系,因此单个分类对象可以与多个定义对象关联。
从上面的问题中,我意识到分类对象不是一个事务实体,而是或多或少是一个记录系统,这意味着它将在所有映射之后对它进行任何更改。话虽如此,根据问题,尝试更新Classification类的属性以取消关联映射可能会有问题!相反,我提出了以下数据模型。
当前型号:
拟议模型:
根据建议的模型,您不需要更新记录系统分类对象的任何属性。相反,你的工作将更多地是删除&amp;创建新的ClassificationMapper对象。分类的示例类将如下所示:
class ClassificationMapper{
Long definitionId; // Primary key for Definition
Long classificationId; // Primary key for Classification
}
ClassificationMapper类与Definition类具有多对一的组合关系,与Classification类具有多对一的关联关系。
答案 1 :(得分:0)
我认为这可以使用update
查询而不是delete
来完成,因为您正在更新分类而不是删除它。试试这样的事情
update Classification c set c.definition = null where c.definition.id = :defId
修改强>
假设Definition
和Classification
之间的关系是双向@OneToMany
,正如您在问题中所说的那样,而不是many-to-many
正如您的映射文件所说的那样。
答案 2 :(得分:0)
您可以从数据库中读取定义x,对分类执行正常的删除过程并再次保存x。应该这样做。
答案 3 :(得分:0)
我猜您可以使用orphanRemoval=true
选项,因此您只需要从Classiciation
实例
Definition
实例
请注意,此选项仅适用于1:n(又名OneToMany)和1:1(又名OneToOne)关系,请参阅here
编辑:
由于您添加了ManyToMany
关系的事实,我建议您这样做:
Definition x = fetchSomeDefinitionFromTheDatabase();
Classification c = x.getClassifications().get(0);
x.getClassifications().remove(c);
definitionDaoOrService.update(x);
由于您已选择save-update
作为级联类型,因此x
和c
之间的关联应该消失,但它们仍然存在。