2017-08-30 292 views
0

在我的春節,啓動應用程序的網絡實體,有兩種類型的實體:UserGroup休眠:刪除實體

  1. 用戶可以根據自己的0到N組
  2. 組可以有1〜 M個成員

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方法這是應該刪除從存儲庫中的用戶。此刪除操作應執行一系列操作:刪除該用戶擁有的所有組,並將刪除的組從其成員的組列表中刪除。所有這些應該保存到存儲庫。

如果我添加其他類型的實體到這個網絡,這個過程變得更加複雜。

我的問題是:不休眠自動處理?我是否應該抓住每個成員並逐個刪除組並將其保存到存儲庫?

回答

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

+0

在您的例子,如果一個帳戶被刪除,難道我們要經過所有誰指向該帳戶的員工和刪除該帳戶'賬號'一個接一個地設置?我的例子與你的稍有不同。 –