J'utilise Java et Hibernate 3.6.4.Final. TABLE_B est une table de mappage pour un type spécifique d'entités A (B) qui ont une relation OneToMany avec les entités X.
J'ai des problèmes pour insérer une entité B dans la base de données.
La lecture des entités B à partir de la base de données n'est pas un problème et les entités X associées sont correctement chargées.L'insertion échoue pour le mappage Hibernate @OneToMany avec l'héritage
modèle DB:
- TABLE_A (id, page active)
- TABLE_B (a_id, x_id)
- TABLE_X (id, informations)
Un "A" entité peut avoir zéro ou plusieurs relations avec des entités X.
Une entité "A" avec une ou plusieurs relations avec Xs est appelée entité "B" et a son propre comportement dans le code.
(Les noms de classe et de table a été modifiée pour la simplicité)
@Entity
@Table(name = "TABLE_A")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class A {
...
}
@Entity
@Table(name="TABLE_B")
@PrimaryKeyJoinColumn(name="A_ID", referencedColumnName = "ID")
public class B extends A implements Serializable {
@OneToMany(cascade={CascadeType.ALL})
@JoinTable(
name="TABLE_B",
joinColumns = @JoinColumn(name="A_ID"),
inverseJoinColumns = @JoinColumn(name="X_ID", insertable = true, nullable = false)
)
private List<X> Xs;
...
}
Le journal:
SQLStatementLogger - insert into TABLE_A (active, info) values (?, ?)
SQLStatementLogger - insert into TABLE_B (A_ID) values (?)
JDBCExceptionReporter - could not insert: [com.test.B] [insert into TABLE_B (A_ID) values (?)]
java.sql.SQLException: Field 'X_ID' doesn't have a default value
Je comprendrais si le problème est dû en spécifiant la table d'entité "TABLE_B" et en utilisant la même chose pour la table de jointure OneToMany mais c'est à quoi ressemble mon modèle de base de données. Pour moi, il semble que Hibernate essaye d'abord d'insérer l'héritage et si ça marche, l'insertion suivante sera le mapping entre B et X. Le problème est que pour moi la table d'héritage et de mapping est la même.
Comment mapper correctement mon modèle de base de données dans Hibernate? L'aide est très appréciée.
Merci pour votre aide ChssPly76, myCh apprécié. –
Ma solution était de: * changer la stratégie d'héritage en table unique * ajouter une colonne discriminante à TABLE_A qui contient le type d'objet que nous avons ("C" ou "B", "A" est abstrait et "C" est similaire à "B") * utilisez TABLE_B comme une table de mappage pour les relations B et X. –