JPA mise à jour de plusieurs à plusieurs enregistrements sUPPression

voix
2

J'ai une relation @ManyToMany entre deux entités. Lorsque j'effectue une mise à jour du côté possédante, il semble que JPA supprime tous les enregistrements liés de ma base de données et les réinsère. Pour moi, c'est un problème parce que j'ai un déclencheur MySQL qui se déclenche avant un enregistrement est supprimé. Toutes les idées sur la façon de contourner ce problème?

@Entity
public class User {

    @Id
    @Column(name=username)
    private String username;

    ...

    @ManyToMany
    @JoinTable(name=groups, joinColumns=
        @JoinColumn(name=username, referencedColumnName=username),
            inverseJoinColumns=@JoinColumn(name=groupname,
                    referencedColumnName=type_id))
    private List<UserType> types;

    ...

}

@Entity
public class UserType {

    @Id
    @Column(name=type_id)
    private String id;

    @ManyToMany(mappedBy=types)
    private List<User> users;

    ...
} 
Créé 17/08/2010 à 16:51
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
2

Utilisez au Setlieu de Listrésoudre le problème. Mais je ne sais pas pourquoi cela fonctionne.

Une autre solution fournie par Hibernate est de diviser l' @ManyToManyassociation en deux bidirectionnelles @OneTo@Manyrelations. Voir Mise en veille prolongée 5.2 Documentation par exemple.

Si une bidirectionnelle @OneToManyassociation fonctionne mieux lors de la suppression ou la modification de l'ordre des éléments de l' enfant, la @ManyToMany relation ne peut pas bénéficier d'une telle optimisation , car le côté clé étrangère ne contrôle pas. Pour contourner cette limitation, la table de lien doit être directement exposé et l' @ManyToManyassociation divisée en deux bidirectionnelles @OneToManyrelations.

Créé 23/10/2017 à 10:49
source utilisateur

voix
1

Il semble mon problème était que je ne fusionnez l'entité.

Créé 18/08/2010 à 18:01
source utilisateur

voix
1

Essaye celui-là:

1) Déclaration de modification:

private List<UserType> types = new Vector<UserType>();

2) ne jamais appeler

user.setTypes(newTypesList)

3) uniquement appel

user.getTypes().add(...);
user.getTypes().remove(...);
Créé 18/08/2010 à 09:29
source utilisateur

voix
1

Son probablement lié à cette question . Vous devez vous assurer d' avoir une une hashCode appropriée définie égale méthode dans votre objet mis en correspondance afin que EclipseLink peut déterminer l' égalité et ainsi déterminer que les objets existants représentés par des objets existants dans la base de données. Sinon , il n'a pas d'autre choix que de recréer l'enfant des objets à chaque fois.

Sinon, je l'ai lu que ce type de jointure ne peut soutenir efficacement l'ajout et la suppression des éléments de la liste si vous utilisez une colonne d'index, mais qui va être spécifique EclipseLink, étant donné que les annotations JPA ne semblent pas soutenir une telle chose. Je sais qu'il ya une annotation équivalent Hibernate, mais je ne sais pas ce qu'il serait EclipseLink, si une telle chose existe.

Créé 17/08/2010 à 16:56
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more