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