Hibernate один в один отображение. Удалить строку из зависимой таблицы
Таблицы: Студент, столбец Address Student.ADDR_ID сопоставляется с Address.ID
Аннотация в моем классе ученика выглядит следующим образом
public class Student {
String name, surname;
int rollNumber;
Teacher classTeacher;
Address address;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="ADDR_ID")
public Address getAddress() {
return address;
}
:
:
Он отлично работает в случае создания и обновления.
Если я изменяю адрес Student на новый, он создает новую строку, но не удаляет строку для старого адреса. Если я установлю адрес на ноль, все равно он не удаляется
например
Student s1 = session.get(Student.class, 24);
Address addr = new Address();
session.save(addr);
s1.setAddress(addr);
session.save(s1);
or
Student s1 = session.get(Student.class, 24);
s1.setAddress(null);
Я установил каскад ВСЕ. Какие дополнительные / разные должны быть сделаны. Здесь применимо обратное?
1 ответ
Вы должны использовать orphanremoval = true
если этого достаточно для вас
@OneToOne(cascade=CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name="ADDR_ID")
public Address getAddress() {
}
В моем случае каскад удаления один к одному не работал, поскольку транзакция не используется. Здесь все работает нормально...
@Entity
@Table(name="student")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Long id;
@Column(name="student_name",length=60)
private String studentName;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "address_id")
private Address address;
//Setter Getter
}
@Entity
@Table(name = "address_table")
public class Address {
@Id
@Column(name = "address_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long addressId;
@Column(name = "street_name", length = 50)
private String street;
@Column(name = "city_name", length = 50)
private String city;
//Setter Getter
}
Student student = session.get(Student.class, 1L);
session.beginTransaction();
session.delete(employee);
session.getTransaction().commit();