2010-06-14 23 views
6

que tienen dos entidades, con las siguientes anotaciones JPA:@OneToOne y @JoinColumn, auto delete null entity, doable?

@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; 
} 

propietario y datos tiene correlación de uno a uno, el lado propietario es propietario. El problema se produce cuando ejecuto: owner.setData (null); ownerDao.update (owner); El Data_id de la tabla "Propietario" se vuelve nulo, eso es correcto.

Pero la fila "Datos" no se elimina automáticamente. Tengo que escribir otro DataDao y otra capa de servicio para ajustar las dos acciones (ownerDao.update (owner); dataDao.delete (data);)

¿Es posible hacer que una fila de datos se elimine automáticamente cuando el propietario Propietario lo puso a nulo?

Respuesta

8

Dependiendo de la versión de hibernación, utilice:

utilice el cascadeType: DELETE_ORPHAN o orphanRemoval = true en la anotación @OneToOne

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

nunca he probado en OneToOne, pero del doc, debería funcionar.

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

o

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

EDIT: me encontré con este SO mensaje: Workarounds for Hibernate's lack of delete-orphan support for one-to-one and many-to-one relationships?

Así perhap es que no está funcionando. Las dos respuestas describen dos soluciones diferentes sin embargo.

+2

¡Gracias, funciona! Y ... CascadeType.DELETE_ORPHAN está en desuso. Se reemplaza por @OneToOne (fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) – smallufo

+0

FetchType.EAGER es esencial para la eliminación huérfana, parece. La eliminación de FetchType.LAZY huérfano no funciona. Hibernate versión 4.3.10.FINAL. –

+0

Usando Hibernate 5.0.11.FINAL, esto fue suficiente para mí '@OneToOne (cascade = CascadeType.ALL, orphanRemoval = true)'. Tuve éxito usando 'FetchType.LAZY' o' FetchType.EAGER'. 'EAGER' es el predeterminado. –

Cuestiones relacionadas