Java Hibernate、Oracle、联接表和关键问题

Java Hibernate、Oracle、联接表和关键问题,java,oracle,hibernate,Java,Oracle,Hibernate,我有三个表,Parent、Child和ParentChild,它们将前两个表连接在一起。执行插入(Parent.getChilds().add(new Child());)时,我会收到一个错误,因为主键显然尚未创建,并且我遇到了约束冲突: java.sql.BatchUpdateException: ORA-02291: integrity constraint (TU.SYS_C0072908) violated - parent key not found 如果我让我的测试用例回滚,这一切

我有三个表,
Parent
Child
ParentChild
,它们将前两个表连接在一起。执行插入(
Parent.getChilds().add(new Child());
)时,我会收到一个错误,因为主键显然尚未创建,并且我遇到了约束冲突:

java.sql.BatchUpdateException: ORA-02291: integrity constraint (TU.SYS_C0072908) violated - parent key not found
如果我让我的测试用例回滚,这一切正常,我不会得到约束冲突,我所有的断言都通过了。如果我将测试用例设置为不回滚,则会出现上述错误。此外,如果父级和子级是在当前事务之外创建的,那么一切都很顺利。即:

Parent parent = parentDao.get(parentId);
Child child = childDao.get(childId);
parent.getChilds().add(child);
child.setParent(parent);
parentDao.save(parent);
映射如下所示:

母公司

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.whatev">
    <class name="Parent">
        <id name="parentId">
            <generator class="native"/>
        </id>
        <set name="childs" table="ParentChild" cascade="all">
            <key column="parentId"/>
            <many-to-many class="Child" column="childId" unique="true"/>
        </set>
    </class>
</hibernate-mapping>
创建记录时,通过触发器按顺序填充主键

我的设置有什么问题?

“一个家长可以有多个孩子,而一个孩子只能有一个家长。”

那么就不应该有parentchild表,因为连接表只需要解析多对多关系


子表应该只包含一个PARENTID列,该列带有父表的外键。

问题在于触发器应用了序列nextval

通过指定
native
,但不告诉hibernate序列,hibernate认为它必须自己找到id,因为Oracle没有任何东西可以本机创建唯一的id
Child.childId
将从序列中获得下一个值(因为触发器覆盖了hibernate提供的内容),并且
ParentChild.childId
获取hibernate分配的值,从而产生约束问题

要以跨数据库友好的方式处理此问题,请删除触发器,保留序列并让Oracle处理ID:

<id name="childId">
    <generator class="native">
        <param name="sequence">CHILDID_SEQ</param>
    </generator>
</id>

CHILDID_SEQ
或者放弃触发器和序列,让hibernate分配ID:

<id name="childId">
    <generator class="native"/>
</id>

虽然我同意你的观点,但DB的设计是我无法掌控的。根据法律,这应该是有效的。
<id name="childId">
    <generator class="native">
        <param name="sequence">CHILDID_SEQ</param>
    </generator>
</id>
<id name="childId">
    <generator class="native"/>
</id>