2011-05-09 2 views
1

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.

Répondre

0

Vous ne pouvez pas avoir TABLE_B à la fois comme table « entité » (par exemple table à laquelle B est cartographiée) et table « join » (par exemple table qui contient des jointures entre B et X).

Dans le premier cas, TABLE_B doit avoir au plus un enregistrement pour chaque enregistrement TABLE_A (qui est, pour les A s qui sont aussi B s); dans le second cas TABLE_B doit avoir autant d'enregistrements que vous avez X éléments dans la collection de B qui présente une contradiction évidente.

Ce que vous pouvez faire, donc, est une des conditions suivantes:

  • Mappez votre collection de Xs sans se joindre à la table (@ManyToOne côté X; @OneToMany mappedBy="X" sur le côté B). Votre 'X_TABLE' devra avoir un a_id (ou b_id, peu importe comment vous l'appelez) FK au propriétaire.
  • Utilisez une autre table (TABLE_B_X pour B -à- X mapping)
+0

Merci pour votre aide ChssPly76, myCh apprécié. –

+1

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. –

Questions connexes