【问题标题】:Hibernate sets null value for a column, instead of deleting the entire row on saveOrUpdate()Hibernate 为一列设置空值,而不是在 saveOrUpdate() 上删除整行
【发布时间】:2011-07-01 20:58:16
【问题描述】:

我有一个 CatastrophePerilAssoc 类,它控制从 Catastrophe 类到 Peril 类的映射,表 CAT_PERIL_ASSOC 包含三行:id(主键,自动生成), catastrophe.id(映射到灾难),和 peril.id(映射到危险)

当我添加或删除关联时,会在表中创建新的关联(行),这很好。但是,hibernate 不会删除旧行,而是将 catastrophe.id 的值设置为 null。有没有办法让我告诉休眠删除这些行?请注意,我不想删除正在其他地方使用的实际对象,但我只想从这个特定的表中删除它们。

查看sql日志,可以确认是把列值设置为null:

update CAT_PERIL_ASSOC set CATASTROPHE_TYPE_ID=null where CATASTROPHE_TYPE_ID=?

Hbm 文件:

<hibernate-mapping package="com.nature">
    <class name="com.nature.CatastrophePerilAssoc" table="CAT_PERIL_ASSOC">
        <id name="id" type="string">
            <column name="id" length="32" />
            <generator class="uuid.hex" />
        </id>
        <many-to-one name="catastrophe" class="com.nature.catastrophe">
               <column name="CATASTROPHE_TYPE_ID" />
         </many-to-one>
         <many-to-one name="peril" class="com.nature.peril">
                <column name="PERIL_ID" />
         </many-to-one>

    </class>
</hibernate-mapping>

Java 类:

public class CatastrophePerilAssoc  {

    private Catastrophe cat; 
    private Peril peril;

    public Catastrophe getCatastrophe() {
        return cat;
    }
    public void setCatastrophe(Catastrophe cat) {
        this.cat = cat;
    }

    public Peril getPeril() {
        return peril;
    }
    public void setPeril(Peril peril) {
        this.peril = peril;
    }
}

更新关联的代码:

public void saveCatPerilAssoc(Catastrophe cat) {

    Criteria polquery = getSession(false).createCriteria(cat.getClass());
    polquery.add(Restrictions.eq("name", cat.getName()).ignoreCase());

    if (cat.getId() != null) {
        polquery.add(Restrictions.ne("id", cat.getId()));
    }

    if (polquery.list().size() > 0) {
        //throw error
    }

    getSession(false).saveOrUpdate(cat);
}

【问题讨论】:

    标签: java database hibernate


    【解决方案1】:

    您需要使用名为 delete-orphan 的级联类型。您需要在 Catastrophe 和 Peril 类上配置 cascade-orphan,因此如果其中任何一个删除了关联,这也会从连接表中删除条目。

    查看documentation 的这一部分,它更好地解释了这个级联。

    还有一个问题。为什么使用 CatastrophePerilAssoc 连接表? Hibernate 管理多对多关系,因此无需创建像 CatastrophePerilAssoc 这样的实体。

    【讨论】:

    • 感谢您的回答!确实,添加 delete-orphan 有所帮助,但我还错过了另一件事......将 saveOrUpdate() 更改为 merge()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多