У меня есть 3 таблицы, Parent
, Child
и ParentChild
, которые соединяют первые две вместе. При выполнении вставки (Parent.getChilds().add(new Child());
) я получаю ошибку, потому что, по-видимому, первичный ключ не был создан, и я получаю нарушение ограничения:
java.sql.BatchUpdateException: ORA-02291: integrity constraint (TU.SYS_C0072908) violated - parent key not found
Если я разрешу откат моего тестового примера, это будет работать нормально, я не получу нарушение ограничения, и все мои утверждения пройдут. Если я установлю свой тестовый случай, чтобы не выполнять откат, я получаю вышеуказанную ошибку. Кроме того, если родитель и потомок были созданы вне текущей транзакции, тогда все работает безупречно. I.e.:
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>
Дети
<?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="Child">
<id name="childId">
<generator class="native"/>
</id>
<join table="ParentChild" inverse="true">
<key column="childId"/>
<many-to-one name="Parent" column="parentId" not-null="true"/>
</join>
</class>
</hibernate-mapping>
A Parent
может иметь более одного Child
, а Child
может иметь только один Parent
. (Было отмечено, что не должно быть таблицы соединения, и вместо этого в таблице CHILD
должен быть столбец PARENTID
, но это решение по проектированию не мое.)
Таблицы также довольно просты:
CREATE TABLE PARENT (
PARENTID NUMBER(38) NOT NULL,
PRIMARY KEY(PARENTID)
);
CREATE TABLE CHILD (
CHILDID NUMBER(38) NOT NULL,
PRIMARY KEY(CHILDID)
);
CREATE TABLE PARENTCHILD (
PARENTID NUMBER(38) NOT NULL,
CHILDID NUMBER(38) NOT NULL,
FOREIGN KEY(PARENTID) REFERENCES PARENT(PARENTID),
FOREIGN KEY(CHILDID) REFERENCES CHILD(CHILDID),
UNIQUE (PARENTID, CHILDID)
);
Первичные ключи заполняются последовательностями через триггер при создании записи.
Что не так с моей настройкой?