2010-12-28 20 views
1

これは私にとってとても単純なシナリオのようですが、私はオンラインでも印刷でもソリューションを見つけることができません。私はいくつかのオブジェクトを持っています。(トリムダウン)Spring/HibernateのFK制約を持つオブジェクトを削除する

@Entity 
public class Group extends BaseObject implements Identifiable<Long> { 
    private Long id; 
    private String name; 
    private Set<HiringManager> managers = new HashSet<HiringManager>(); 
    private List<JobOpening> jobs; 

    @ManyToMany(fetch=FetchType.EAGER) 
    @JoinTable(
      name="group_hiringManager", 
      [email protected](name="group_id"), 
      [email protected](name="hiringManager_id") 
    ) 
    public Set<HiringManager> getManagers() { 
     return managers; 
    } 

    @OneToMany(mappedBy="group", fetch=FetchType.EAGER) 
    public List<JobOpening> getJobs() { 
     return jobs; 
    } 
} 

@Entity 
public class JobOpening extends BaseObject implements Identifiable<Long> { 
    private Long id; 
    private String name; 
    private Group group; 

    @ManyToOne 
    @JoinColumn(name="group_id", updatable=false, nullable=true) 
    public Group getGroup() { 
     return group; 
    } 
} 

@Entity 
public class HiringManager extends User { 

    @ManyToMany(mappedBy="managers", fetch=FetchType.EAGER) 
    public Set<Group> getGroups() { 
     return groups; 
    } 
} 

私はグループオブジェクトを削除します。これで、JobOpeningテーブルとgroup_hiringManagerテーブルに依存関係があり、削除機能が失敗します。私はマネージャーが他のグループを持っているので、削除をカスケードしたいとは思わないし、ジョブのオープンはグループレスにすることができます。依存関係を削除するために私のGroupManagerのremove()関数をオーバーライドしようとしましたが、何を保持していても削除が失敗したようです。

このオブジェクトを削除する正しい方法は何ですか?

答えて

3

グループを削除する前に、グループのジョブ開始リストを反復処理し、グループフィールドにnullを設定します。または、求人テーブルのグループフィールドをNULLにする更新クエリを作成します。何かのように、クエリで

Group group = entityManager.find(Group.class, groupId); 

for (JobOpening aJob : group.getJobs()) { 

    aJob.setGroup(null); 
    entityManager.merge(aJob); 
    entityManager.flush(); 
} 

//Then delete group 

entityManager.remove(group); 

、のようなもの、

entityManager.createQuery("update JobOpening set group = null where group.id = :groupId") 
      .setParameter(groupId) 
      .executeUpdate(); 

その後、グループを削除します。

+0

+1:また、採用マネージャーも同様です。 –

+0

お返事ありがとうございます。私の唯一の疑問は、このコードをSpringにどのように取り込むかです。私はそれが複数のモデルに触れるので、サービスレイヤーに入るはずだと思いますが、マネージャーオブジェクト内からentityManager.flush()を実行する方法を理解できません。それがなければ、ジョブのグループをnullにしてjobOpeningDaoで保存しても削除されません – maxdj

+0

あなたのDAOのコードを表示すると、私はより良い解決策を提案できます。 –