2017-08-11 1 views
0

J'ai deux entités liées à plusieurs à plusieurs: Film et Acteurentité avec plusieurs à plusieurs ayant erreur à insérer avec la même ID

Film

public class Movie { 
    @Id 
    private String imdbId; 
    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER, targetEntity = Actor.class) 
    private Set<Actor> actor; 
} 

Acteur

public class Actor { 
    @Id 
    private String actorId; 
} 

Il est une api reposante et j'envoie json à MovieController. Mon json est:

{ 
    "imdbId": "tt2395424", 
    "actor" : [{"actorId" : "0001"}, {"actorId" : "0002"}] 
} 

Cela fonctionne parfaitement bien et l'acteur est peuplé automatiquement. Mais quand j'insère un nouveau film avec le même acteur, il lance une erreur que l'acteur est déjà présent. Je suis confus parce que, pour autant que je sache, Hibernate compare l'identifiant avant l'insertion s'il n'est pas présent, il insérera d'autre simplement le mapper. Pouvez-vous s'il vous plaît me dire où je vais mal?

Répondre

1

Le problème est avec l'acteur CascadeType.ALL ci-dessus défini dans la classe Movie. Ce que fait CascadeType.ALL effectue la même opération sur les entités incorporées que pour l'entité parente. L'action de sauvegarde essaiera de sauvegarder l'acteur dans la table Actor, si l'identifiant de l'acteur est déjà présent dans la base de données, alors save va lancer l'erreur. Essayez d'utiliser saveOrUpdate au lieu de save opération sur l'entité de film.

+0

Mais j'utilise persist ... quelle est l'autre alternative à saveOrUpdate lors de l'utilisation de persist to save? –

+0

Vous pouvez utiliser la fusion au lieu de persister, c'est une alternative à saveOrUpdate. Trouver plus de détails sur https://stackoverflow.com/questions/1069992/jpa-entitymanager-why-use-persist-over-merge –

+0

Merci .. cela fonctionne, mais aucune idée sur ID généré automatiquement, car pour ceux que je suis peur, il crée un doublon –