Ho controllato molti messaggi su internet e nessuno affronta il problema. Apprezzo davvero se qualcuno può aiutare! Ho una relazione figlio genitore OneToMany. Hibernate non mette in cascata il figlio dell'inserto (Livello2) quando una delle chiavi composite del bambino è la chiave esterna del genitore (Livello1). Ho specificato cascade = "all" e non importa l'inverso è vero o falso, i risultati sono gli stessi. Non c'è eccezione, e semplicemente non inserisce. Sotto la stampa mostra che Level1 è stato inserito con successo ma Level2 è stato selezionato, nessun inserto.No cascata inserire per bambino con chiave esterna sul genitore
Hibernate: INSERT INTO sst.level_1 (STATO, NOME) valori Hibernate (,??): Selezionare level2x_.LEVEL_1_ID, level2x_.TIMESEGMENT, level2x_.CATEGORY come CATEGORY4_ da sst.level_2 level2x_ dove level2x_.LEVEL_1_ID =? e level2x_.TIMESEGMENT =?
Le API sono Hibernate 4.1.6/Spring 3.1.2.
Ecco la definizione della tabella per 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
);
Ecco il codice di prova.
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 per Livello1:
<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 per Livello2:
<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>
Grazie per la risposta. Ha senso che l'id di livello 1 sia nullo, e ciò ha causato il problema. In questo caso, come configurare la transazione per renderla atomica per i livelli 1 e 2? – John
Vedere i miei aggiornamenti per salvare sia il bambino che il genitore nella transazione – Shailendra