पर विदेशी कुंजी वाले बच्चे के लिए कोई कैस्केड डालने नहीं मैंने इंटरनेट पर कई पोस्ट की जांच की है और कोई भी मेरी समस्या का समाधान नहीं करता है। अगर कोई मदद कर सकता है तो वास्तव में सराहना करें! मेरे पास OneToMany माता-पिता के बच्चे के रिश्ते हैं। हाइबरनेट डालने वाले बच्चे (लेवल 2) को कैस्केड नहीं करता है जब बच्चे की समग्र कुंजी माता-पिता (लेवल 1) की विदेशी कुंजी होती है। मैंने कैस्केड = "सब" निर्दिष्ट किया है और इससे कोई फर्क नहीं पड़ता कि उलटा सच या गलत है, परिणाम समान हैं। कोई अपवाद नहीं है, और यह बस सम्मिलित नहीं करता है। प्रिंट आउट शो के नीचे लेवल 1 सफलतापूर्वक डाला गया था लेकिन लेवल 2 केवल चयनित था, कोई सम्मिलित नहीं था।पैरेंट
हाइबरनेट: sst.level_1 में डालने (स्थिति, नाम) मान हाइबरनेट (,?): CATEGORY4_ के रूप में चयन level2x_.LEVEL_1_ID, level2x_.TIMESEGMENT, level2x_.CATEGORY sst.level_2 level2x_ जहां level2x_.LEVEL_1_ID = से? और level2x_.TIMESEGMENT =?
एपीआई हाइबरनेट 4.1.6/वसंत 3.1.2 हैं।
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
);
यहाँ परीक्षण कोड है:
यहाँ MySQL के लिए तालिका परिभाषा है। Level1 के लिए
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 आईडी शून्य है, जिससे समस्या उत्पन्न हुई। इस मामले में, मैं स्तर 1 और 2 के लिए परमाणु बनाने के लिए लेनदेन को कैसे कॉन्फ़िगर करूँगा? – John
लेनदेन में बच्चे और माता-पिता दोनों को बचाने के लिए मेरे अपडेट देखें – Shailendra