使用HQL删除对象之间的关系

时间:2015-02-19 14:27:36

标签: java hibernate hql

我有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中编写删除查询以删除类的对象。但我不知道如何删除班级属性的值。

有人可以建议吗?

4 个答案:

答案 0 :(得分:2)

从上面的问题中,我发现解决方案的数据建模存在问题。 根据上述设计,定义对象可以包含多个分类对象。并且,由于两个实体之间存在多对多关系,因此单个分类对象可以与多个定义对象关联。

从上面的问题中,我意识到分类对象不是一个事务实体,而是或多或少是一个记录系统,这意味着它将在所有映射之后对它进行任何更改。话虽如此,根据问题,尝试更新Classification类的属性以取消关联映射可能会有问题!相反,我提出了以下数据模型。

当前型号: enter image description here

拟议模型: enter image description here

根据建议的模型,您不需要更新记录系统分类对象的任何属性。相反,你的工作将更多地是删除&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

修改

假设DefinitionClassification之间的关系是双向@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作为级联类型,因此xc之间的关联应该消失,但它们仍然存在。