【问题标题】:Hibernate: Delete an entity in network of entities休眠:删除实体网络中的实体
【发布时间】:2017-08-30 07:55:38
【问题描述】:

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

  1. 用户可以拥有 0 到 N 个群组
  2. 组可以有 1 到 M 个成员

User 类中,有一个Group 列表,他/她拥有或者是其成员,在Group 类中,有一个User 列表(即成员)。

这些类使用休眠注释相互引用。

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 不会自动处理这个问题吗?我是不是应该把每个成员都抓起来,一个一个地删除组,然后保存到存储库中?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    CascadeType.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

    【讨论】:

    • 在您的示例中,如果一个帐户被删除,我们是否必须遍历所有指向该帐户的员工并从accounts删除该帐户?我的例子和你的略有不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多