我使用 Hibernate和spring数据来使用oracle DB管理我的实体
我有以下实体
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@NotNull
private String title;
}
和另一个
@Entity
@Table(name = "user_detail")
public class UserDetail {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String address;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
}
我想在删除用户时删除子项'用户详细信息'(级联) 如何用hibernate解决这个问题
答案 0 :(得分:2)
为了执行级联,您必须在代码中进行一些更改。
首先,您必须在User实体中映射UserDetail并在关系注释中包含级联设置:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@NotNull
private String title;
@OneToOne(mappedBy="user", cascade=CascadeType.ALL)
private UserDetail detail;
}
PS:我假设一对一的关系,但可以随心所欲地映射...所有hibernate的关系注释都支持级联。也支持映射的集合。
通过执行此操作,您告诉Hibernate在对User实体执行操作时执行级联。如果您想确切地告诉它必须执行级联的操作,您可以这样做:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@NotNull
private String title;
@OneToOne(mappedBy="user", cascade={CascadeType.PERSIST, CascadeType.DELETE})
private UserDetail detail;
}
您可以在Hibernate文档中找到所有CascadeTypes。请注意,为了执行级联,您应该避免使用休眠会话"更新","保存"和" saveOrUpdate"方法......你应该使用"坚持"和"合并"。
答案 1 :(得分:0)
解决方案是添加On Delete注释'@OnDelete(action = OnDeleteAction.CASCADE)' 关系之上如下:
@Entity
@Table(name = "user_detail")
public class UserDetail {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String address;
@ManyToOne
@JoinColumn(name = "user_id")
@OnDelete(action=OnDeleteAction.CASCADE)
private User user;
}