2010-06-14 3 views
6

J'ai deux entités, avec les annotations JPA suivantes:@OneToOne et @JoinColumn, entité de suppression automatique de caractère nul, faisable?

@Entity 
@Table(name = "Owner") 
public class Owner implements Serializable 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private long id; 

    @OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL) 
    @JoinColumn(name="Data_id") 
    private Data Data; 
} 

@Entity 
@Table(name = "Data") 
public class Data implements Serializable 
{ 
    @Id 
    private long id; 
} 

Propriétaire et de données sur un à-un, le côté propriétaire est propriétaire. Le problème se produit lorsque j'exécute: owner.setData (null); ownerDao.update (propriétaire); La Data_id de la table "Propriétaire" devient nulle, c'est correct. Mais la ligne "Données" n'est pas supprimée automatiquement. Je dois écrire un autre DataDao, et une autre couche de service pour envelopper les deux actions (ownerDao.update (propriétaire); dataDao.delete (data);)

Est-il possible de faire une ligne de données automatiquement supprimée lorsque le propriétaire Le propriétaire l'a mis à null?

Répondre

8

En fonction de votre version de mise en veille prolongée, utilisez:

utiliser le CascadeTypes: DELETE_ORPHAN ou orphanRemoval = true sur l'annotation @OneToOne

documentation: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-transitive

Je ne l'ai jamais essayé sur OneToOne, mais du doc, ça devrait marcher.

@OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL) 
@JoinColumn(name="Data_id") 
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) 
private Data Data; 

ou

@OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL, orphanRemoval=true) 
@JoinColumn(name="Data_id") 
private Data Data; 

EDIT: J'ai trouvé ce SO message: Workarounds for Hibernate's lack of delete-orphan support for one-to-one and many-to-one relationships?

Alors est perhap cela ne fonctionne pas. Les deux réponses décrivent deux solutions de contournement différentes cependant.

+2

Merci, ça marche !!! Et ... CascadeType.DELETE_ORPHAN est obsolète. Il est remplacé par @OneToOne (fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) – smallufo

+0

FetchType.EAGER est essentiel pour la suppression des orphelins, il semble. La suppression FetchType.LAZY orpheline ne fonctionne pas. Hibernate version 4.3.10.FINAL. –

+0

En utilisant Hibernate 5.0.11.FINAL, c'était suffisant pour moi '@OneToOne (cascade = CascadeType.ALL, orphanRemoval = true)'. J'ai réussi à utiliser 'FetchType.LAZY' ou' FetchType.EAGER'. 'EAGER' est par défaut. –

Questions connexes