休眠:删除实体网络中的实体

时间:2017-08-30 07:55:38

标签: java hibernate

在我的Spring启动应用中,有两种类型的实体:UserGroup

  1. 用户可拥有0到N组
  2. 群组可以有1到M个成员
  3. 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不会自动处理吗?我应该抓住每个成员并逐个删除该组并将其保存到存储库吗?

1 个答案:

答案 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。

如需进一步阅读,请浏览以下链接:

CascadeTypes