JPA ne pas insérer de nouvelles de l'enfant de "un à plusieurs" de la relation lorsque nous utilisons de fusion

Ma question est assez semblable à la suivante:

JPA: Comment puis-je ajouter de nouveaux Éléments dans une Liste avec un OneToMany annotation

Pourquoi la fusion n'est pas en cascade sur une relation un-à-plusieurs

JPA avec JTA: Persistant de l'entité et de fusion en cascade enfant entités

J'ai aussi eu un coup d'oeil dans Wikibooks mais toujours pas à régler mon problème

Donc, mon problème est que j'ai une classe Parent avec l'enfant, et quand j'ai ajouter un nouvel enfant et utiliser l'entityManager.de fusion(parent) pour mettre à jour les nouveaux enfants qui ne sont pas insérés et j'obtiens une erreur de null clé primaire.

Je suis en mesure de créer un Parent avec tout ce que les enfants que je veux, et de mettre à jour les thèses des enfants, mais pas pour ajouter un nouvel enfant.

Exemple:

@Entity
public class Parent {
    private String name;
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    private List<Child> children;
}
@Entity
public class Child {
    private String name;
    @ManyToOne
    private Parent parent;
}

Si je crée un Parent avec des enfants, il fonctionne très bien. Si je mettre à jour les enfants attributs, il fonctionne très bien, et si j'ajoute un nouvel enfant, le parent, il ne fonctionne pas.

public void foo(){

    Parent parent = new Parent();
    List<Child> children = new ArrayList<Child>();
    children.add(new Child());
    children.add(new Child());
    children.add(new Child());
    parent.setChildren(children);
    //it works
    entityManager.persist(parent);

    //and lets say that I have updated some attributes
    changeAttributesValues(parent);
    changeAttributesValues(children);
    //it still working and the values are updated properly
    entityManager.merge(parent);

    //but if I add some child
    List<Child> children = parent.getChildren();
    children.add(moreOneChild);
    parent.setChildren(children);
    entityManager.merge(parent);
    //here I got an error saying that jpa cannot insert my attribute because my PK is null
}

Note: Mon PK est une Clé composite (permet de dire que dans cet exemple que c'est le idFromParent + idCompany)

Merci d'avance.

MODIFIER

J'ai résolu le problème en supprimant la clé composite et l'ajout d'une auto ID généré. Je poste mon code et ce que j'ai fait pour le faire fonctionner. Avec ce code,

@Entity
public class Serie implements Serializable{ 

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SERIE_ID_SEQ")
    @SequenceGenerator(name = "SERIE_ID_SEQ", sequenceName = "real.serie_id_seq")
    @Column(name = "idserie")
    private Long id;

    @Basic
    @Column(name = "nmserie")
    private String nmSerie;

    @OneToMany(mappedBy = "serie", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    private List<SerieExercise> serieExercises;

    @ManyToOne
    @JoinColumn(name = "idtrainning")
    private Trainning Trainning;
}

@Entity
public class SerieExercise implements Serializable{

    @Basic
    @Column(name = "nrrepetition")
    private int nrRepetition;

    @Column(name = "tminterval")
    @Temporal(TemporalType.TIMESTAMP)
    private Date tmInterval;

    @Id
    @Basic
    @Column(name = "nrorder")
    private Integer nrOrder;

    @Id
    @ManyToOne
    @JoinColumn(name = "idexercise")
    private Exercise exercise;

    @Id
    @ManyToOne
    @JoinColumn(name = "idserie")
    private Serie serie;
}

Avec ce code, j'obtiens cette erreur quand j'essaie d'insérer une plus SerieExercise dans ma Liste:

Caused by: org.postgresql.util.PSQLException: ERRO: ERROR: null value in column "nrorder" violates not-null constraint
  Detail: Failing row contains(null, 10, null, null, null).
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2270)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1998)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:570)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:420)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:366)
    at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeUpdate(WrappedPreparedStatement.java:493)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
    ... 132 more

J'ai le débogage et les valeurs avant que j'appelle l'entityManager.merge() ne sont pas null. Je suis de l'utilisation d'hibernate fournisseur. Je suis en mesure d'insérer une Série avec ce SerieExercise je veux dans ma liste, et capable de mettre à jour les valeurs, mais pas en mesure d'ajouter un nouveau SerieExercise dans ma Liste.

Pour corriger, j'ai fait ces changements:

@Entity
public class SerieExercise implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SER_EXER_ID_SEQ")
    @SequenceGenerator(name = "SER_EXER_ID_SEQ", sequenceName  = "realvida.ser_exer_id_seq")
    @Column(name = "idserieexercicio")
    private Long id;

    @Basic
    @Column(name = "nrrepetition")
    private int nrRepetition;

    @Column(name = "tminterval")
    @Temporal(TemporalType.TIMESTAMP)
    private Date tmInterval;

    //@Id
    @Basic
    @Column(name = "nrorder")
    private Integer nrOrder;

    //@Id
    @ManyToOne
    @JoinColumn(name = "idexercise")
    private Exercise exercise;

    //@Id
    @ManyToOne
    @JoinColumn(name = "idserie")
    private Serie serie;
}

Personne ne sait pourquoi ça arrive? Puis-je faire ce travail à l'aide d'une clé composite?

Laissez-moi savoir si vous avez besoin de plus d'infos.

  • Avez-vous mis le parent dans moreOneChild? Pouvez-vous faire un exemple plus simple?
  • Désolé, le code édité maintenant. Semble que le problème est lié à avoir une clé primaire composite. Je suis encore en recherche.
  • Je peux obtenir votre enregistrer la séquence de travail, donc il n'y a rien de mal à cela. Vous avez besoin de faire un reproductibles question. Si vous avez une clé primaire composite et une violation de clé, qui doit être la base de votre question
  • Il a obtenu, merci pour l'astuce, c'est mon seconf question ici, la prochaine fois je vais essayer d'améliorer ma question.
  • Où est le code pour lorsque vous essayez d'insérer une plus SerieExercise dans la Liste?
  • Vous devez ajouter une nouvelle question au lieu d'ajouter sur un déjà existant. Vous avez accepté une réponse qui n'est pas une réponse. Même si c'est nice pour récompenser l'effort, d'autres lecteurs peuvent être induits en erreur en pensant que c'est en fait une réponse.