2010-11-11 3 views
0

Je suis nouveau en hibernation. Donc, je ne sais pas comment faire:Hibernate: supprime les enregistrements de la table d'association avec des clés étrangères

J'ai 3 tables:

Tableau Personne:

@Entity 
@Table(name = "ASD_PERSON") 
public class AsdPerson implements Serializable { 
    @Id 
    @SequenceGenerator(name="seq_name", sequenceName="gen_id_value", allocationSize = 1) 
    @GeneratedValue(generator="seq_name") 
    @Column(name="F_PERSON_ID", nullable = false) 
    private Long fPersonId; 

    @OneToMany(mappedBy = "AsdPerson", 
       cascade = CascadeType.ALL, 
       orphanRemoval = true) 
    private List<AsdPersonEvent> asdPersonEventList; 

    ... setters and getters ... 
} 

Table événement:

@Entity 
@Table(name = "ASD_EVENT") 
public class AsdEvent implements Serializable { 
    @Id 
    @SequenceGenerator(name="seq_name", sequenceName="gen_id_value", allocationSize = 1) 
    @GeneratedValue(generator="seq_name") 
    @Column(name="F_EVENT_ID", nullable = false) 
    private Long fEventId; 

    @OneToMany(mappedBy = "AsdEvent", 
       cascade = CascadeType.ALL, 
       orphanRemoval = true) 
    private List<AsdPersonEvent> asdPersonEventList; 

    ... setters and getters ... 
} 

Tableau Personne-événement:

@Entity 
@Table(name = "ASD_PERSON_EVENT") 
@IdClass(AsdPersonEventPK.class) 
public class AsdPersonEvent implements Serializable { 
    @Id 
    @GenericGenerator(name = "generator", strategy = "foreign", 
         parameters = @Parameter(name = "property", value = "asdPerson")) 
    @GeneratedValue(generator = "generator") 
    @Column(name="F_PERSON_ID", nullable = false, insertable = false, 
      updatable = false) 
    private Long fPersonId; 

    @Id 
    @GenericGenerator(name = "generator", strategy = "foreign", 
         parameters = @Parameter(name = "property", value = "asdEvent")) 
    @GeneratedValue(generator = "generator") 
    @Column(name="F_EVENT_ID", nullable = false, insertable = false, 
      updatable = false) 
    private Long fEventId; 

    @ManyToOne 
    @JoinColumn(name = "F_PERSON_ID", insertable = false, 
       updatable = false) 
    private AsdPerson asdPerson; 

    @ManyToOne 
    @JoinColumn(name = "F_EVENT_ID", insertable = false, 
       updatable = false) 
    private AsdEvent asdEvent; 

    ... setters and getters ... 
} 

Tout fonctionne parfaitement (ajout de nouveaux enregistrements, la création de nouveaux objets), sauf le cas, lorsque je tente de supprimer les enregistrements associés de la table d'événements ou d'une table de personne:

... 
AsdEvent ev = getService().get(115); // get record from Event table by id = 115 (for example) 
ev.getAsdPersonEventList().remove(1); // delete some existing records 
getService().merge(ev); 
... 

Après que j'obtiens l'erreur:

deleted object would be re-saved by cascade (remove deleted object from associations): [database.AsdPersonEvent#[email protected]]

Comment configurer Hibernate avec des annotations ou un autre moyen de se débarrasser de cette erreur?

+0

essayez à la place @Cascade ({CascadeType.SAVE_UPDATE, CascadeType.DELETE_ORPHAN}) et montrez comment vous supprimez AsdPersonEvent de la liste. – blow

+0

J'ai montré comment je supprime AsdPersonEvent de la liste. – brazh

+0

@blow: Non, cela ne fonctionne pas. Je ne comprends pas, ce que vous voulez dire quand vous dites: "montrez comment vous supprimez AsdPersonEvent de la liste". – brazh

Répondre

0

Essayez une nouvelle fois en enlevant orphanRemoval = true

+0

Je l'ai essayé, mais ça ne m'a pas aidé. Il n'y a pas d'erreurs, mais les enregistrements n'ont pas été supprimés. – brazh

2

Si vous avez un graphique complexe d'entités persistantes, je pense que vous devez renoncer à utiliser orphanRemoval et retirez vos entités manuellement à l'aide em.remove().

orphanRemoval est conçu pour les relations parent-enfant simples, où l'enfant n'a pas de sens sans parent. Si dans votre cas l'enfant peut avoir d'autres relations, ce n'est peut-être pas un bon cas pour orphanRemoval.

+0

Lorsque je sauvegarde l'objet ev, il a la structure ev-> AsdPersonEvent (non null) -> AsdPerson (non nul) -> AsdPersonEvent (null). Je peux supprimer manuellement les enregistrements de AsdPersonEvent avant d'enregistrer ev, mais je pense qu'il existe une solution plus appropriée avec les annotations Hibernate. – brazh

+0

@brazh: Mis à jour. – axtavt

+0

Merci pour la réponse. Jusqu'à présent, je supprime manuellement les enregistrements de AsdPersonEvent, mais s'il y a une meilleure solution, je vais l'utiliser avec plaisir :) – brazh

Questions connexes