2012-03-10 6 views
2

私は(簡体字)、以下の問題が持っている:1対1でentityManager.remove()を呼び出すときにHibernateは参照されたエンティティを削除しますか?

@Entity 
public class Membership { 

    private User user; 

    @ManyToOne(cascade = CascadeType.ALL) 
    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

} 

...と、以下の対応するクラス:私は多対1の関係で実体を持って

を-many側:

@Entity 
public class User extends Person { 
    private Set<Membership> memberships = new HashSet<Membership>(); 

    @OneToMany(mappedBy = "user", cascade = { CascadeType.MERGE, 
      CascadeType.REMOVE, CascadeType.REFRESH }) 
    public Set<Membership> getMemberships() { 
     return memberships; 
    } 

    public void setMemberships(Set<Membership> memberships) { 
     this.memberships = memberships; 
    } 
} 

私はnew経由user1というユーザーや会員mem1を作成し、このようにそれらをリンクした:

mem1.setUser(user1); 
user1.getMemberships().add(mem1); 

は、私はこのようにそれらを永続化しています:

entityManager.getTransaction().begin(); 
entityManager.persist(user1); 
entityManager.persist(mem1); 
entityManager.getTransaction().commit(); 

は今、私はメンバーシップを削除したいです。だから私は呼ん:

entityManager.remove(mem1); 

...私はMembership側にUsercascade=CascadeType.REMOVEcascade=CascadeType.ALLを設定したリコール。しかし、参照番号mem1user1から自動的に削除されません。すなわち、user1.getMemberships()はまだmem1を保持しています!これは正しい動作ですか?エンティティをデータベースから削除するとき、JPAはオブジェクトから参照を自動的に削除しませんか?

これは疑問に思えるかもしれませんが、私はJPAの初心者です。注釈があなたにとって何の役目を果たしているか正確に見ることは難しい場合もあります。

答えて

3

削除をカスケードすると、参照されたエンティティ(またはエンティティの集合)に対してHibernateがentityManager.remove()を呼び出します。したがって、参照されたエンティティはデータベースから削除されます。しかし、それは実体のインスタンスを手つかずのままにします。

ManyToOneにカスケード= REMOVE(またはALL)を設定することは、通常非常に悪い考えです。一般に、メンバーシップの1つだけを削除するときにユーザーを削除したくない場合。

2

この場合、うーん、うまくいきません。

  • あなたがJPA2を使用している場合、orphanRemoveオプションを追加します:あなたの関連するエンティティは、あなたが2つのいずれかを行うことができますそれらを削除することを確認するためには、いない切り離されたりするかもしれないという事実による

    @OneToMany(mappedBy = "whatever"、orphanRemoval = true)

  • JPA1を使用する場合は、手動で削除する必要があります。

関連する問題