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?
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
thx pour l'indice, c'est-à-dire la dernière phrase - qui a conduit à la bonne piste :-) Sauvé ma journée. – LeO