【发布时间】: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);
}
【问题讨论】: