Hibernate устанавливает нулевое значение для столбца вместо удаления всей строки в saveOrUpdate () - PullRequest
0 голосов
/ 02 июля 2011

У меня есть класс CatastrophePerilAssoc, который управляет отображением класса Catastrophe в класс Peril, с таблицей CAT_PERIL_ASSOC, которая имеет три строки: id (первичный ключ, автоматически сгенерированный), catastrophe.id (сопоставленный с катастрофой),и peril.id (сопоставленный с опасностью)

Когда я добавляю или удаляю ассоциации, в таблице создаются новые ассоциации (строки), что нормально.Однако hibernate не удаляет старые строки, а вместо этого устанавливает значение catastrophe.id в значение null.Есть ли способ сказать мне, чтобы Hibernate удалить эти строки вместо этого?Обратите внимание, что я не хочу удалять фактические объекты, так как они используются в другом месте, но я просто хочу удалить их из этой конкретной таблицы.

Глядя на журнал sql, я могу подтвердить, что это настройказначение столбца в ноль:

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);
}

1 Ответ

1 голос
/ 02 июля 2011

Вам необходимо использовать каскадный тип с именем delete-orphan .Необходимо настроить cascade-orphan для классов Catastrophe и Peril, поэтому, если какой-либо из них удалит связь, это также удалит запись из таблицы объединения.

Проверьте этот раздел документации 1006 *, что объясняет этот каскад лучше.

И один вопрос.Почему вы используете таблицу соединений CatastrophePerilAssoc?Hibernate управляет многими отношениями, поэтому нет необходимости создавать такие объекты, как CatastrophePerilAssoc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...