Yee*_*Fei 5 java sql hibernate unique-constraint self-referencing-table
我正在尝试为有序孩子设计双向父子设计。
从父级中删除子级(例如3个子级中的第2个子级)时,hibernate生成的sql导致唯一约束冲突,因为在“删除”(目标)之前执行了“更新”(同级)。
我使用的RDBMS(H2)不支持延迟约束。除了以下内容,我还有哪些选择?
有什么办法可以让休眠生成在“更新”之前带有“删除”的sql吗?
在论坛中发现了一些旧的讨论:
数据库架构:
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
);
Run Code Online (Sandbox Code Playgroud)
类:
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>();
}
Run Code Online (Sandbox Code Playgroud)
HBM映射:
<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>
Run Code Online (Sandbox Code Playgroud)
Hibernate 不会直接执行 HQL(或 SQL)语句,而是在执行 HQLcommit()或SQL 语句时flush()重新排序 SQL 语句,目标是以最有效的方式执行它们。但 Hibernate 的重新排序可能是错误的,例如导致违反约束,就像您的情况一样。
解决方案是引入一个中间体flush()。flush()强制重新排序并发送 SQL 语句,但不提交。
在您的情况下,您可以修改代码,例如(作为草图):
transaction = session.beginTransaction();
session.delete(obj);
session.flush(); /* newly introduced */
session.update(...);
transaction.commit();
Run Code Online (Sandbox Code Playgroud)
如果问题出在级联删除或 Hibernate 在您无法控制的情况下执行的某些删除,那么您必须控制删除和更新过程,并在代码中显式执行操作,而不是依赖 Hibernate 的自动化。
| 归档时间: |
|
| 查看次数: |
3673 次 |
| 最近记录: |