Я пытаюсь смоделировать двунаправленный родительско-дочерний дизайн с упорядоченными детьми.Как изменить порядок выполнения sql в hibernate
При удалении дочернего элемента (например, ребенка № 2 из 3-х детей) из родителя, сгенерированный sql-модуль спящего режима привел к уникальному нарушению ограничения, поскольку перед «удалением» (мишенью) выполняется «обновление» (сиблинг).
RDBMS, который я использую (H2), не поддерживает отложенное ограничение. Каковы варианты, которые у меня есть, помимо следующего?
- удалить ограничение уникальности из схемы
- явно управлять сортировкой сам, а не зависеть от спячки
Есть ли способ, чтобы сделать спящий режим генерации SQL с «удалить» «обновления» предшествует?
Некоторые старые дискуссии нашли в форуме:
DELETE then INSERT in collection - Order of executed SQL
DB Schema:
CREATE TABLE IF NOT EXISTS Sequences (
ID BIGINT NOT NULL AUTO_INCREMENT,
Name LONGVARCHAR,
Type LONGVARCHAR,
Sequence LONGVARCHAR,
ParentId BIGINT DEFAULT NULL,
Index INT,
CONSTRAINT pk_SequenceId PRIMARY KEY (ID),
CONSTRAINT uc_Sequences UNIQUE (ParentId, Index),
CONSTRAINT fk_Sequences
FOREIGN KEY (ParentId)
REFERENCES Sequences(ID)
ON UPDATE CASCADE
ON DELETE CASCADE
);
Класс:
public class Sequence {
protected Long ID;
protected String name;
protected String type;
protected String sequence;
protected Sequence parentSequence;
protected List<Sequence> childSequences = new ArrayList<Sequence>();
}
HBM Mapping:
<hibernate-mapping>
<class name="Sequence" table="Sequences">
<id name="ID" column="ID" type="long">
<generator class="native"/>
</id>
<property name="name" type="string" column="Name"/>
<property name="type" type="string" column="Type"/>
<property name="sequence" type="string" column="Sequence"/>
<many-to-one name="parentSequence" column="parentId" cascade="save-update" insert="false" update="false" class="Sequence" />
<list name="childSequences" inverse="false" lazy="true" cascade="all-delete-orphan">
<key column="parentId" not-null="true"/>
<list-index column="Index" base="0"/>
<one-to-many class="Sequence"/>
</list>
</class>
спасибо за предложение. будет очень сложно вручную выполнить повторный заказ, поскольку может произойти несколько операций (чередование add/remove) (как работает бизнес-логика приложения), прежде чем объект будет возвращен модулю сохранения (например, при сохранении) :( – YeenFei
Флеш также может быть неявным образом, когда вы вызываете конкретный запрос выбора и все еще ожидаете изменения, которые должны быть сброшены, Hibernate может просто решить, что они сами сбросят их. – Gimby