私はインターネット上で多くの投稿をチェックしましたが、私の問題は解決しません。誰かが助けることができれば本当に感謝します! 私はOneToMany親子関係を持っています。子コンポジット・キーの1つが親の外部キー(Level1)である場合、Hibernateは挿入子(Level2)をカスケードしません。私はcascade = "all"を指定し、その逆が真か偽であっても、結果は同じです。例外はなく、挿入するだけではありません。プリントアウトの下にLevel1が正常に挿入されたがLevel2のみが選択され、挿入されていないことが示されています。親に外部キーを持つ子のカスケード挿入はありません
休止:sst.level_1(STATUS、NAME)値を挿入 休止(?):level2x_.LEVEL_1_ID = sst.level_2 level2x_からCATEGORY4_としてlevel2x_.LEVEL_1_ID、level2x_.TIMESEGMENT、level2x_.CATEGORYを選択? level2x_.TIMESEGMENT =?
APIは、Hibernate 4.1.6/Spring 3.1.2です。ここ
は、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
);
は、テストコードです。レベル1のため
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);
}
}
マッピング:Level2のため
<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>
マッピング:
<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>
返信いただきありがとうございます。レベル1のIDがヌルであることがわかります。これが問題の原因です。この場合、レベル1と2の間でトランザクションをアトミックにするようにトランザクションを構成するにはどうすればよいでしょうか? – John
トランザクションで子と親の両方を保存するための更新を表示 – Shailendra