我有兩個表:配方表和帳戶表。食譜表存儲了一些食譜。賬戶表存儲了一些用戶賬戶。用戶可以與0個或更多配方相關聯。當用戶喜歡配方時,該用戶與配方關聯。爲了記錄這個關聯,我創建了一個名爲LikedRecipe表的表。如何刪除與JPA和休眠許多表之間的關係
這些都是每個表的列:
- 配方:編號,名稱。 Id是主鍵。
- 帳號:電子郵件,密碼。電子郵件是主鍵。
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表中刪除記錄?我是否以正確的方式使用清除方法?
謝謝。
從配方到用戶建立關係的意圖是跟蹤喜歡配方的用戶數量。無論何時我必須顯示喜歡每個食譜的用戶數量的食譜列表,此功能都非常關鍵。 – zfranciscus
還有另外一種方法可以達到這個目標。您也可以使用JPQL(SQL變體用於JPA)並創建方法來獲取給定配方的用戶數 - LikedRecipe表上的簡單計數函數:) – Equo
謝謝您的幫助。 – zfranciscus