【问题标题】:How to remove relationship between many to many table with JPA and Hibernate如何使用 JPA 和 Hibernate 删除多对多表之间的关系
【发布时间】:2012-12-11 10:24:19
【问题描述】:

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

这些是每个表的列:

  • 配方:身份证、姓名。 Id 是主键。
  • 帐户:电子邮件、密码。电子邮件是主键。
  • LikedRecipe:ID、姓名、电子邮件。 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 表中删除记录?我是否以正确的方式使用 clear 方法?

谢谢。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    分离的实体是当前不受持久性上下文管理但其 id 存在于数据库中的实体。

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

    如果您想保持多对多关系,则在您即将删除 LikedRecipe 实体时,您还必须清除它们(即从 Account 和 Recipe 的集合中删除对象)。

    【讨论】:

      【解决方案2】:

      设计应该是这样的:

        - 食谱(id,名称)
        - 用户(电子邮件,...)
        - LikedRecipe(userEmail, recipeId)?
      并且不要在用户的配方中建立关系,它(在我看来)是无用的关系。 在这种情况下,从用户(/帐户)到配方建立 OneToMany 关系就足够了,而在用户的配方中没有关系。

      【讨论】:

      • 创建从食谱到用户的关系的目的是跟踪喜欢食谱的用户数量。每当我必须显示一个包含喜欢每个食谱的用户数量的食谱列表时,此功能至关重要。
      • 还有另一种方法可以实现这一目标。您还可以使用 JPQL(JPA 的 SQL 变体)并创建方法来获取给定配方的用户计数 - LikedRecipe 表上的简单计数函数:)
      • 感谢您的帮助。
      猜你喜欢
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 2017-10-30
      • 2011-04-22
      • 2021-07-12
      • 1970-01-01
      相关资源
      最近更新 更多