2017-08-17 1 views
0

J'ai une entité Property qui a plusieurs PropertyAttributes - gérées liste, à savoirJPA - OneToMany lutte

@OneToMany(mappedBy = "property", cascade = { CascadeType.ALL}, fetch = FetchType.EAGER) 
@JoinFetch(value = JoinFetchType.INNER) 
private List<PropertyAttribute> propertyAttribute; 

dans le PropertyAttribute je aussi bien une référence au Property, à savoir

@Id 
@JsonIgnore 
@JoinColumn(name = "property_id") 
@ManyToOne 
private Property property; 

quand je sauvegarde un nouveau Property, par exemple id=10400 que le PropertyAttribute supplémentaire est enregistré avec le même ID - comme prévu. Ma méthode save() ressemble:

public void save(){ 
    //begin transaction 
    getEntityManager.persist(newProperty); 
    // end transaction... 
    //begin transaction... 
    getEntityManager.merge(newPropertyAttriubtes); 
    // end transaction 
} 

Mais quand je joue le second tour de save() (maintenant avec id=10401 puis-je obtenir des résultats étranges, à savoir:

getEntityManager().find(Property.class,10400) 

a maintenant PropertyAttribute avec Property-id = 10401 , c'est-à-dire à partir du dernier enregistrement sauvegardé (= mauvais contenu!)

Des idées pour lesquelles cela échoue avec la deuxième sauvegarde - S'agit-il d'un problème de DB ou d'EclipseLink?

+1

Cela n'a aucun sens. Si la clé étrangère 'property_id' est l'ID, comment cette relation peut-elle être utilisée dans un OneToMany? OneToMany implique qu'il y a beaucoup de propertyAttributes avec la même valeur d'ID, ce qui le rend non unique. Un ID doit être immuable: si un champ utilisé doit être modifié, il ne doit pas être utilisé comme ID. Assurez-vous également que vous ne modifiez pas simplement des valeurs sur quelque chose que vous avez déjà transmis à JPA pour le gérer. – Chris

+0

thx pour l'indice, c'est-à-dire la dernière phrase - qui a conduit à la bonne piste :-) Sauvé ma journée. – LeO

Répondre

0

J'ai finalement compris comment le faire correctement: -/Juste dans d'autres cas, la lutte même ...

public void save(){ 
    //begin transaction 
    getEntityManager.persist(newProperty); 
    // end transaction... 
    newPropertyAttriubtes.forEach(attr -> { 
      //begin transaction... 
      getEntityManager.merge(attr); 
      // end transaction 
      newProperty.attach(attr) 
    } 
    //begin transaction 
    // to have the PropertyAttributes attached in the EntityManager => merge 
    getEntityManager.merge(newProperty); 
    // end transaction... 
    } 
} 

Thx pour Chris me pointer vers la bonne direction pour ne pas modifier l'entité après JPA gérer!