我有两个表:配方表和帐户表。配方表存储了许多配方。帐户表存储了许多用户帐户。用户可以与0个或更多配方相关联。当用户喜欢食谱时,该用户与食谱相关联。为了记录这种关联,我创建了一个名为LikedRecipe表的表。
这些是每个表的列:
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表中删除记录?我是否以正确的方式使用了清晰的方法?
谢谢。
答案 0 :(得分:0)
最好不要设计如下设计:
答案 1 :(得分:0)
分离实体是一个当前不由持久化上下文管理的实体,但其id存在于数据库中。
我认为您没有删除LikedRecipe实体,因为您仍然从其他持久性实体(帐户和配方)引用它。实际上,当您清除持久性上下文时,它会工作,分离所有“保持活动”您想要删除的LikedRecipe的实体。
如果您想要保持多对多关系,那么当您要删除LikedRecipe实体时,您也必须清除它们(即从Account和Recipe的集合中删除对象)。