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

标签 java hibernate jpa

我有两个表:食谱表和帐户表。 Recipe 表存储许多食谱。帐户表存储了一些用户帐户。一个用户可以关联 0 个或多个食谱。当用户喜欢某个菜谱时,该用户就会关联到该菜谱。为了记录这种关联,我创建了一个名为 LikedRecipe 的表。

这些是每个表的列:

  • 配方:编号、名称。 Id 是主键。
  • 帐户:电子邮件、密码。电子邮件是主键。
  • 喜欢的食谱: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 方法?

谢谢。

最佳答案

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

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

如果要保留多对多关系,则在删除 LikedRecipe 实体时也必须清除它们(即从帐户和食谱的集合中删除对象)。

关于java - 如何使用 JPA 和 Hibernate 删除多对多表之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13818210/

相关文章:

java - XSLT : set name of transformed output file

java - 我在哪里可以找到 web.xml 中 web-app 元素的版本属性的有效值?

java - java.library.path 中没有 lwjgl - Netbeans

java - 如何处理 Java 中的 StackOverflowError?

java - 用于此映射的 Hibernate 自定义 HQL

java - Hibernate 禁用默认行为

java - Ehcache 只对 Hibernate 中的一张表起作用

java - 不在数据库中保存枚举值,为什么?

java - 如何使用急切获取定义 "select *"JPA 谓词?

java - 基于游标的表分页没有唯一且连续的 id 列?