gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:08:03 25 4
gpt4 key购买 nike

我有两个表:食谱表和帐户表。 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com