2009-11-06 2 views
3

Lorsque j'essaie d'enregistrer un ID de ma classe parent dans une classe enfant, l'erreur persiste "ERROR - Le champ 'parent_id' n'a pas de valeur par défaut "Un-à-plusieurs ID parent-enfant unidirectionnel Enregistrer

J'ai essayé tous les types de mappings. J'utilise des annotations.

Toute aide sur ce serait apprécié

Parent:

 @Id 
     @Column(name="id") 
     @GeneratedValue(strategy=GenerationType.AUTO) 
     private long id; 
     @Column(name="description") 
     private String description; 
     @OneToMany 
     @Cascade(value= {org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE}) 
     @JoinColumn(name="parent_id") 
     private List<Child> children; 

enfant:

@Id 
    @Column(name="id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private long id; 
    @Column(name="description") 
    private String description; 

Merci.

+1

Que voulez-vous dire par « Lorsque vous essayez d'enregistrer un ID de ma classe mère dans une classe d'enfants ». Peux-tu élaborer? –

Répondre

6

Vous devez avoir quelque chose de mal à un autre endroit car ces mappages fonctionneront comme ils le sont. Ils pourraient être meilleurs, mais ils fonctionneront. Plus précisément, toutes les annotations @Column sont redondantes et inutiles, et en tant que non notées, vous devez utiliser la propriété en cascade de @OneToMany de JPA au lieu de @Cascade de Hibernate. J'ai créé un runnable example avec la version nettoyée de ce que vous avez posté. Si vous avez git et Maven, vous pouvez l'exécuter avec:

git clone git://github.com/zzantozz/testbed tmp 
cd tmp 
mvn -q compile exec:java \ 
    -Dexec.mainClass=rds.hibernate.UnidirectionalManyToOneJoinColumn \ 
    -pl hibernate-unidirectional-one-to-many-with-join-column 

Il crée un parent avec deux enfants, ce qui les sauve, puis les charge et imprime le graphique. La sortie est:

Creating parent with two children 
Loading saved parent 
Parent{description='parent', children=[Child{description='child 2'}, Child{description='child 1'}]} 
1

Changez votre @OneToMany-@OneToMany(cascade=CascadeType.ALL) utilisation JPA plutôt que les extensions Hibernate

+2

Bien que certainement une suggestion valable, cela ne répond pas exactement à la question de l'OP. – ChssPly76

+0

ChssPly76 Absolument correct, je suppose que son utilisation des extensions ici étaient suivies sans fondement que le 'parent_id' ne se propage correctement. Ses annotations semblent toutes correctes à côté des changements que j'ai suggérés. Que penses-tu du manque d'information du PO? –

+0

Il est impossible de dire sans plus d'informations. – ChssPly76

0

Je pense que le @JoinColumn annotation a besoin d'un referencedColumnName affecté.

@JoinColumn(name = "parent_id", referencedColumnName = "id") 
+0

referencedColumnName n'est pas nécessaire dans le cas typique de création d'une clé étrangère référençant une clé primaire. De la docs: "Par défaut (s'applique uniquement si une seule colonne de jointure est utilisée): Le même nom que la colonne de clé primaire de la table référencée." –

11

Un ajout tardif au cas où quelqu'un rencontrerait le même problème.

Cette entité ici, quand persista en utilisant Hibernate 4.1.8, sera cascade les FieldChange entités, mais pas remplir la colonne de jointure:

@Entity 
public class Event { 

    //ID and other fields here 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinColumn(name = "event_id") 
    private List<FieldChange<?>> fields = new ArrayList<FieldChange<?>>(); 

} 

Ni ne l'instruction d'insertion défini la colonne event_id et ne met pas à jour l'entité insérée après le fait - le event_id reste nul et la relation est perdue.

Si, cependant, la définition @JoinColumn est modifiée comme suit:

@JoinColumn(name = "event_id", nullable = false) 

, l'instruction d'insertion comprend la colonne event_id comme il se doit, et tout va bien.

Cela peut être seulement une régression dans cette version particulière de Hibernate, mais peut-être que cela aide quelqu'un.

+2

Je me suis vraiment gratté la tête sur ce problème et en changeant '@JoinColumn (name =" event_id ")' à @ @JoinColumn (name = "event_id", nullable = false) 'résolu le problème. –

4

Dans votre cas, le fournisseur JPA pour persister l'objet enfant avec son parent effectue au moins trois requêtes sur db. Les deux premiers persistent les objets par leurs propres moyens. Le dernier objet enfant a été mis à jour avec le parent référençant la clé étrangère.La deuxième requête échoue car vous avez une contrainte NOT NULL sur la colonne de clé étrangère. Vous disposez de trois options:

  1. Supprimer NOT NULL contrainte sur clé étrangère dans l'entité enfant
  2. Utilisation de la relation bidirectionnelle
  3. Changement de fournisseur JPA à celui qui prend en charge ces cas.
+0

L'option 1 a résolu ce problème en utilisant EclipseLink 2.5.1 Merci! –

Questions connexes