在我的Spring启动应用中,有两种类型的实体:User
和Group
:
在User
课程中,有一个他/她拥有或是其成员的Group
列表,在Group
课程中,列出了User
(即成员)。
这些类使用hibernate注释相互引用。
class User {
@ManyToMany(cascade = CascadeType.REFRESH)
private List<Group> groups;
}
class Group {
@ManyToOne(cascade = CascadeType.REFRESH)
@NotNull
@JoinColumn(name="OWNER_ID", referencedColumnName="id")
private User owner;
@ManyToMany
@JoinTable(joinColumns = @JoinColumn(referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(referencedColumnName = "id"))
private List<User> members;
}
在User
服务层中有一个Delete
方法,该方法应该从存储库中删除用户。此删除应触发一系列操作:删除该用户拥有的所有组,并从其成员组列表中删除已删除的组。所有这些都应该保存到存储库中。
如果我将其他类型的实体添加到此网络,则此过程会变得更加复杂。
我的问题是:hibernate不会自动处理吗?我应该抓住每个成员并逐个删除该组并将其保存到存储库吗?
答案 0 :(得分:1)
CascadeType.REFRESH表示可以使用refresh方法从数据库重新加载托管对象。
这无助于您解决您的要求。您需要使用“orphanRemoval = true”CascadeType。 “orphanRemoval = true”在拥有的对象从其拥有的关系中删除时从数据库中删除它。
示例:
EmployeeEntity.java
@Entity @Table(name = "Employee")
public class EmployeeEntity implements Serializable
{
private static final long serialVersionUID = -1798070786993154676L;
@Id @Column(name = "ID", unique = true, nullable = false)
private Integer employeeId;
@Column(name = "FIRST_NAME", unique = false, nullable = false, length = 100)
private String firstName;
@Column(name = "LAST_NAME", unique = false, nullable = false, length = 100)
private String lastName;
@OneToMany(orphanRemoval = true, mappedBy = "employee")
private Set<AccountEntity> accounts;
}
AccountEntity.java
@Entity (name = "Account") @Table(name = "Account")
public class AccountEntity implements Serializable
{
private static final long serialVersionUID = 1L;
@Id @Column(name = "ID", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer accountId;
@Column(name = "ACC_NO", unique = false, nullable = false, length = 100)
private String accountNumber;
@ManyToOne
private EmployeeEntity employee;
}
或者您也可以使用CascadeType.ALL。
如需进一步阅读,请浏览以下链接: