2

Recipe テーブルと Account テーブルの 2 つのテーブルがあります。Recipe テーブルには、多数のレシピが格納されます。アカウント テーブルには、多数のユーザー アカウントが格納されます。ユーザーは 0 個以上のレシピに関連付けることができます。ユーザーがレシピを気に入ると、このユーザーはレシピに関連付けられます。この関連付けを記録するために、LikedRecipe テーブルというテーブルを作成しました。

これらは、各テーブルの列です。

  • レシピ: ID、名前。Id は主キーです。
  • アカウント: メール、パスワード。メールが主キーです。
  • LikedRecipe: 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 メソッドは永続コンテキストをクリアし、すべての管理対象エンティティを切り離します。

私の質問は、detach とはどういう意味ですか? また、上記の方法で作成したオブジェクトをデタッチすると、LikedRecipe テーブルからどのようにレコードが削除されるのでしょうか。clear メソッドを正しい方法で使用していますか?

ありがとうございました。

4

2 に答える 2

0

次のようなデザインにする方が良いはずです:

    - レシピ(id,name)
    - ユーザー(メール, ...)
    - いいねレシピ(userEmail, レシピID)?
また、ユーザーのレシピに関係を作成しないでください。(私の謙虚な意見では) 役に立たない関係です。この場合、User (/Account) から Recipe への OneToMany 関係を作成し、Recipe for Users で関係を作成しないだけで十分です。

于 2012-12-11T10:34:53.113 に答える
0

切り離されたエンティティは、現在永続コンテキストによって管理されていないが、ID がデータベースに存在するエンティティです。

LikedRecipe エンティティは、他の永続エンティティ (Account および Recipe) からまだ参照されているため、削除されないと思います。実際、永続コンテキストをクリアすると機能し、削除したい LikedRecipe を「維持」しているすべてのエンティティを切り離します。

多対多の関係を維持したい場合は、LikedRecipe エンティティを削除しようとしているときに、それらもクリアする必要があります (つまり、Account のコレクションと Recipe のコレクションからオブジェクトを削除します)。

于 2012-12-11T12:00:06.993 に答える