2011-10-06 4 views
0

J'ai les entités suivantes et je dois supprimer les entrées ServiceRegistration et ServiceChannels lorsque je supprime l'enregistrement ServiceRegistration. Mais maintenant, si je supprime un enregistrement dans serviceregistration, il supprime les enregistrements dans le canal qui est la table de métadonnées.Spring MVC 3 Hibernate JPA Annotations onetomany et manytoone relations cascade delete

ServiceRegistration.Java

@OneToMany(cascade=CascadeType.ALL,fetch = FetchType.EAGER) 
@JoinTable(name = "ServiceChannel", joinColumns = { 
@JoinColumn(name="serviceid", unique = true) 
}, 
inverseJoinColumns = { 
@JoinColumn(name="channelid") 
} 
) 

private List<Channels> channelsInvolved; 

    public List<Channels> getChannelsInvolved() { 
    return channelsInvolved; 
    } 

public void setChannelsInvolved(List<Channels> channelsInvolved) { 
    this.channelsInvolved = channelsInvolved; 
    } 

ServiceChannels.java

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column private int servicechannelid;  

@ManyToOne 
@JoinColumn(name = "serviceid") 
private ServiceRegistration serviceRegistration; 

@ManyToOne 
@JoinColumn(name = "channelid") 
private Channels channels; 

Channels.java >> contient des méta-données

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column private int channelid; 
@Column private String channelname; 

@Override 
    public boolean equals(final Object obj) { 
     if (obj instanceof Channels) { 
      final Channels other = (Channels) obj; 
      if (other.getChannelid() == getChannelid()) { 
       return true; 
      } 
     } 
     return false; 
    } 

S'il vous plaît aidez-moi comment faire cascade supprimer dans ce relation d'entité.

Répondre

0

Tout d'abord, si vous ne voulez pas d'obtenir des canaux supprimés lors de la suppression d'un ServiceRegistration, vous devez faire:

@OneToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "ServiceChannel", joinColumns = { 
@JoinColumn(name="serviceid", unique = true) 
}, 
inverseJoinColumns = { 
@JoinColumn(name="channelid") 
} 
) 

private List<Channels> channelsInvolved; 

Dans votre service d'enregistrement (désactiver en cascade).

Aussi, si vous voulez obtenir votre ServiceChannel supprimé lorsque vous supprimez un ServiceRegistration, vous devez configurer la relation dans le côté ServiceRegistration:

@OneToMany(mappedBy="serviceRegistration", cascade=CascadeType.REMOVE) // Edited to specify the owning side of the relationship 
private List<ServiceChannel> serviceChannels; 
+0

Je reçois cette clé error..Foreign (FK47A18582B04FBB38: mcp_service_mcp_servicechannel [serviceChannels_servicechannelid])) doit avoir le même nombre de colonnes que la clé primaire référencée (mcp_servicechannel [serviceid, channelid]) – Surez

+0

J'ai modifié la réponse pour ajouter le côté propriétaire de la relation (attribut mappedBy). Ceci est nécessaire dans la relation OneToMany. –

+0

J'ai fait les changements comme vous l'avez dit, quand je supprime un enregistrement de service sans aucun servicechannels, ça fonctionne très bien. Mais si j'ai un servicechannel pour un enregistrement de service, son lancer 'Impossible de supprimer l'enregistrement !!! La mise à jour par lot a renvoyé un nombre de lignes inattendu de ....'. Je vois la requête générée par hibernate comme Hibernate: supprimer de mcp_servicechannel où serviceid =? Hibernate: supprimer de mcp_servicechannel où servicechannelid =? – Surez

Questions connexes