Tôi đã kiểm tra nhiều bài đăng trên internet và không có vấn đề gì về vấn đề của tôi. Thực sự đánh giá cao nếu có ai có thể giúp! Tôi có mối quan hệ cha mẹ con OneToMany. Hibernate không ghép tầng chèn con (Level2) khi một trong các khóa tổng hợp con là khóa ngoài cho cấp độ gốc (Cấp độ 1). Tôi chỉ định cascade = "tất cả" và không có vấn đề nghịch đảo là đúng hay sai, kết quả là như nhau. Không có ngoại lệ, và nó chỉ đơn giản là không chèn. Dưới đây in ra cho thấy Level1 đã được chèn thành công nhưng Level2 chỉ được chọn, không chèn.Không có chèn tầng cho con với khóa nước ngoài trên cha mẹ
Hibernate: chèn vào sst.level_1 (STATUS, NAME) giá trị Hibernate (,?): Chọn level2x_.LEVEL_1_ID, level2x_.TIMESEGMENT, level2x_.CATEGORY như CATEGORY4_ từ sst.level_2 level2x_ nơi level2x_.LEVEL_1_ID =? và level2x_.TIMESEGMENT =?
API được Hibernate 4.1.6/Spring 3.1.2.
Dưới đây là định nghĩa bảng cho mySQL:
CREATE TABLE level_1
(
ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
STATUS int,
NAME varchar(255)
);
CREATE TABLE level_2
(
LEVEL_1_ID int,
TIMESEGMENT int,
CATEGORY varchar(2),
PRIMARY KEY (LEVEL_1_ID, TIMESEGMENT),
FOREIGN KEY (LEVEL_1_ID) REFERENCES level_1(ID) ON DELETE CASCADE
);
Đây là mã kiểm tra.
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
doInsert(context);
}
private static void doInsert(ApplicationContext context) {
Level1 level1 = new Level1();
Level2 level2 = new Level2();
level1.setName("LEVEL 1 NAME");
level1.setStatus(1);
level1.getLevel2s().add(level2);
level2.setLevel1(level1);
level2.setCategory("CA");
level2.setId(new Level2Id(level1.getId(), 10));
Level1DAO level1DAO = (Level1DAO) context.getBean("Level1DAO");
level1DAO.save(level1);
}
}
Mapping cho Level1:
<hibernate-mapping>
<class name="com.jc.hibernate.Level1" table="level_1" catalog="sst">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="identity" />
</id>
<property name="status" type="java.lang.Integer">
<column name="STATUS" />
</property>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<set name="level2s" inverse="true" cascade="all">
<key>
<column name="LEVEL_1_ID" not-null="true" />
</key>
<one-to-many class="com.jc.hibernate.Level2" />
</set>
</class>
</hibernate-mapping>
Mapping cho level2:
<hibernate-mapping>
<class name="com.jc.hibernate.Level2" table="level_2" catalog="sst">
<composite-id name="id" class="com.jc.hibernate.Level2Id">
<key-property name="level1Id" type="java.lang.Integer">
<column name="LEVEL_1_ID" />
</key-property>
<key-property name="timesegment" type="java.lang.Integer">
<column name="TIMESEGMENT" />
</key-property>
</composite-id>
<many-to-one name="level1" class="com.jc.hibernate.Level1" update="false" insert="false" fetch="select">
<column name="LEVEL_1_ID" not-null="true" />
</many-to-one>
<property name="category" type="java.lang.String">
<column name="CATEGORY" length="2" />
</property>
</class>
</hibernate-mapping>
Cảm ơn bạn đã trả lời. Nó có nghĩa là id cấp 1 là null, gây ra vấn đề. Trong trường hợp này, làm thế nào tôi cấu hình giao dịch để làm cho nó nguyên tử cho cấp 1 và 2? – John
Xem nội dung cập nhật của tôi để lưu cả trẻ em và cha mẹ trong giao dịch – Shailendra