2011-07-08 9 views
2

表の作成時にOneToMany関係で外部キーを作成しないようJPAに指示する方法はありますか?私がしようとしていることのいくつかのサンプルコードは次のとおりです。外部キーのないHibernate OneToMany

私はProjectとGroupという2つのエンティティを持っています。各プロジェクトには多数のブログを含めることができ、各グループには多数のブログを含めることができます。ただし、すべてのブログを格納するブログテーブルは1つだけです。ブログテーブルには、親コンテナのIDを保持するcontainerIdという列があります。ブログは、ID 100を持つグループに属している場合たとえば、ブログのcontainerIdは列には、私は、有効なグループIDでブログテーブルにブログを挿入しようとすると、私が取得値100

@OneToMany(fetch=FetchType.EAGER, mappedBy="containerId") 
@Where(clause="containertype=600") 
public Set<BlogEntity> getBlogs() { 
    return blogs; 
} 

を保持しています"整合性制約違反 - 親なしFK84B5A4F0388ED18Fテーブル:PROJECT文中"というハイバネートエラーです。 ProjectとGroupの両方がブログテーブルの同じ列(containerId)に外部キーを作成しようとしたようです。この問題を回避するにはどうすればよいですか?

答えて

0

BlagテーブルにContainerIDが1つあることは、私の意見では悪いアプローチです。ブログテーブルを2つの異なるテーブルに結合するために、2つの異なるテーブルを作成する方がよいでしょう。 BlogProjectテーブルとBlogGroupテーブルを持つことができます。それぞれBlogIDとProjectIDまたはGroupIDをそれぞれ持っています。これらのテーブルは、ブログがどこにマップされるかを示す指標になります。これは、ManyToMany関係で使用するのと同じ種類のアプローチです。

1

まず、Hibernateでテーブルを作成する必要はありません。カスタムSQLスクリプトを使用することができます。

ここで、このようなデータベース設計は、container_id列に外部キー制約を適用できないため、あまりクリーンではありません。

ブログテーブルで2つの列(group_idとproject_id)を使用するか、2つの結合テーブル(group_blogsとproject_blogs)を使用します。これはHibernateを幸せにし、データベースを改善します。

このデザインによってブログがグループとプロジェクトに属している可能性がある場合は、ブログテーブルでcheck制約を使用して、group_idまたはproject_idがnullであることを確認してください。しかし、2つの結合テーブルではやりにくいです。あなたが本当にそのデザインを維持したいのであれば、鍵は@Any注釈を使って逆関係を(ブログからグループ/プロジェクトに)マッピングすることだと思います。

関連する問題