@OneToOne и @JoinColumn, автоматическое удаление нулевого объекта, выполнимо? - PullRequest
10 голосов
/ 14 июня 2010

У меня есть две сущности со следующими аннотациями JPA:

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

Владелец и данные имеют однозначное сопоставление, владельцем является владелец. Проблема возникает, когда я выполняю: owner.setData (null); ownerDao.update (владелец) ; Data_id таблицы «Владелец» становится нулевым, это правильно.

Но строка «Данные» не удаляется автоматически. Мне нужно написать еще один DataDao и другой сервисный слой, чтобы обернуть два действия (ownerDao.update (owner); dataDao.delete (data);)

Возможно ли сделать строку данных автоматически удаленной, если владелец-владелец установит для нее значение null?

1 Ответ

14 голосов
/ 14 июня 2010

В зависимости от вашей спящей версии, используйте:

используйте аннотацию @OneToOne cascadeType: DELETE_ORPHAN или orphanRemoval = true

документация: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-transitive

Я никогда не пробовал это на OneToOne, но из документа оно должно работать.

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

или

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

EDIT: я нашел этот пост: Обходные пути для отсутствия поддержки Hibernate удаления-сироты для отношений один-к-одному и многие-к-одному?

Так что, возможно, это не работает. Однако два ответа описывают два разных обходных пути.

...