2012-12-11 46 views
2

我有兩個表:配方表和帳戶表。食譜表存儲了一些食譜。賬戶表存儲了一些用戶賬戶。用戶可以與0個或更多配方相關聯。當用戶喜歡配方時,該用戶與配方關聯。爲了記錄這個關聯,我創建了一個名爲LikedRecipe表的表。如何刪除與JPA和休眠許多表之間的關係

這些都是每個表的列:

  • 配方:編號,名稱。 Id是主鍵。
  • 帳號:電子郵件,密碼。電子郵件是主鍵。
  • LikedRecipe:id,name,email。 id是主鍵。

    @Entity 
    @Table(name = "Recipe") 
    public class Recipe { 
    
    private Set<Account> account; 
    
    private Long id; 
    
    
    @ManyToMany(fetch = FetchType.LAZY) 
    @JoinTable(name = "LikedRecipe", joinColumns = @JoinColumn(name = "recipeId"),  inverseJoinColumns = @JoinColumn(name = "email")) 
    public Set<Account> getAccount() { 
    return account; 
    } 
    
    public void setAccount(Set<Account> account) { 
    this.account = account; 
    } 
    
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "id") 
    public Long getId() { 
    return id; 
    } 
    
    public void setId(Long id) { 
    this.id = id; 
    } 
    } 
    
    @Entity 
    @Table(name = "Account") 
    public class Account implements Serializable { 
    
    private Set<Recipe> likedRecipes = new HashSet<Recipe>(); 
    
    private String email; 
    
    @ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL }) 
    @JoinTable(name = "LikedRecipe", joinColumns = @JoinColumn(name = "email"), inverseJoinColumns = @JoinColumn(name = "recipeId")) 
    public Set<Recipe> getLikedRecipes() { 
    return likedRecipes; 
    } 
    
    
    public void setLikedRecipes(Set<Recipe> likedRecipes) { 
    this.likedRecipes = likedRecipes; 
    } 
    
    @Column(name = "email") 
    @Id 
    public String getEmail() { 
    return email; 
    } 
    
    
    public void setEmail(String email) { 
    this.email = email; 
    } 
    } 
    

我寫了一個方法來刪除一個賬號和配方之間的關聯:

public void unlikeARecipe(String email, Long recipeId){ 
Query query = entityManager 
    .createQuery("delete from LikedRecipe where recipeId = :recipeId and email = :email"); 
query.setParameter("recipeId", recipeId); 
query.setParameter("email", email); 
query.executeUpdate(); 
} 

這種方法並沒有從LikedRecipe表中刪除記錄,直到我加入這行代碼在該方法的結束:

entityManager.clear();

根據JPA API記錄clear方法清除持久化上下文,導致所有被管理實體分離。

我的問題是分離的含義是什麼?而且,分離對象如何使上述方法從LikedRecipe表中刪除記錄?我是否以正確的方式使用清除方法?

謝謝。

回答

0

分離的實體是當前不由持久化上下文管理的實體,但其ID在數據庫中存在。

我想你沒有得到LikedRecipe實體的刪除,因爲你仍然有它從其他持久實體(帳戶和食譜)引用。事實上,當你清除持久化上下文時,它會起作用,將所有你想要刪除的LikedRecipe「存活」的實體分開。

如果您想要保留多對多關係,則當您要刪除LikedRecipe實體時,您還必須清除它們(即從Account和Recipe的集合中刪除該對象)。

0

Shouldn't是更明智的設計是這樣的:

    - 配方(ID,姓名)
    - 用戶(電子郵件,...)
    - LikedRecipe(USEREMAIL,recipeId)?
不要在用戶的配方中建立關係,這是(在我的愚見)無用的關係。 對於這種情況下,從用戶(/帳戶)到配方的OneToMany關係就足以讓用戶在食譜中進行關聯。

+0

從配方到用戶建立關係的意圖是跟蹤喜歡配方的用戶數量。無論何時我必須顯示喜歡每個食譜的用戶數量的食譜列表,此功能都非常關鍵。 – zfranciscus

+1

還有另外一種方法可以達到這個目標。您也可以使用JPQL(SQL變體用於JPA)並創建方法來獲取給定配方的用戶數 - LikedRecipe表上的簡單計數函數:) – Equo

+0

謝謝您的幫助。 – zfranciscus