如何使用JPA和Hibernate删除多对多表之间的关系

时间:2012-12-11 10:24:20

标签: java hibernate jpa

我有两个表:配方表和帐户表。配方表存储了许多配方。帐户表存储了许多用户帐户。用户可以与0个或更多配方相关联。当用户喜欢食谱时,该用户与食谱相关联。为了记录这种关联,我创建了一个名为LikedRecipe表的表。

这些是每个表的列:

  • 食谱:id,name。 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表中删除记录?我是否以正确的方式使用了清晰的方法?

谢谢。

2 个答案:

答案 0 :(得分:0)

最好不要设计如下设计:

    - 食谱(id,名称)
    - 用户(电子邮件,......)
    - LikedRecipe(userEmail,recipeId)?
并且不要在用户的配方中建立关系,它(以我的拙见)无用的关系。 对于这种情况,足以使用户(/帐户)与食谱之间建立OneToMany关系,并且在用户配方中无关系。

答案 1 :(得分:0)

分离实体是一个当前不由持久化上下文管理的实体,但其id存在于数据库中。

我认为您没有删除LikedRecipe实体,因为您仍然从其他持久性实体(帐户和配方)引用它。实际上,当您清除持久性上下文时,它会工作,分离所有“保持活动”您想要删除的LikedRecipe的实体。

如果您想要保持多对多关系,那么当您要删除LikedRecipe实体时,您也必须清除它们(即从Account和Recipe的集合中删除对象)。