У меня есть два Объекта со следующими аннотациями 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 (пустой указатель); ownerDao.update (владелец); Data_id таблицы "Owner" становится пустым, это корректно.
Но строка "Данных" не удалена автоматически. Я должен записать другой DataDao и другой уровень служб для обертывания этих двух действий (ownerDao.update (владелец); dataDao.delete (данные);)
Действительно ли возможно сделать строку данных автоматически удаленной, когда Владелец владения установил его в NULL?
В зависимости от версии гибернации используйте:
используйте cascadeType: DELETE_ORPHAN или orphanRemoval = true в аннотации @OneToOne
документация: 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;
РЕДАКТИРОВАТЬ: Я нашел это сообщение SO: Обходные пути для Hibernate отсутствия поддержки delete-orphan для отношений «один-к-одному» и «многие-к-одному»?
Так что, возможно, это не работает. Однако два ответа описывают два разных обходных пути.