状況
ように私は単一テーブル継承のために構成さDiscriminatorColumn
、持つエンティティを有する:DiscriminatorColumn主キー/ IDの一部
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE")
public class ContainerAssignment{
...
}
'ContainerAssignment' は別のエンティティへの参照を有する。
@JoinColumn(name="CONTAINER_ID")
private Container container;
コンテナのタイプは、それぞれTYPEがContainerAssignment
です。つまり、ContainerAssignment
テーブルの主キーはCONTAINER_ID
とTYPE
で定義されています。
ContainerAssignment
には、いくつかのサブクラスがあります。
@Entity
@DiscriminatorValue("SOME_TYPE")
public class SomeTypeOfContainerAssignment extends ContainerAssignment{
...
}
のみ与えられたCONTAINER_ID
のための単一のSomeTypeOfContainerAssignment
インスタンスがあります。
問題
私はContainerAssignmentテーブルの上にJPA @Id
としてだけでコンテナを定義した場合、私は偉大である、entityManager.find(SomeTypeOfContainerAssignment.class, containerId)
を行うことができます。これはSELECT * FROM CONTAINER_ASSIGNMENT WHERE CONTAINER_ID = 1 AND TYPE = 'SOME_TYPE';
の行に沿って何かを実行します。これは、エンティティの@DiscriminatorValue("SOME_TYPE")
注釈のために、ここでTYPEチェックが必要であることを知っています。
しかし、これは、Containerが実際にプライマリキーではないため、ContainerからContainerAssignmentへの逆参照が中断することを意味します。たとえば、コンテナに@OneToOne(mappedBy=container) private SomeTypeOfContainerAssignment assignment;
がある場合、コンテナを読み込むと、タイプチェックなしでSELECT * FROM CONTAINER_ASSIGNMENT WHERE CONTAINER_ID = 1;
のようなものが割り当て内に読み込まれます。これにより、コンテナのすべての代入が得られます。次に、一見無作為に、潜在的に間違った型を選択します。この場合、例外がスローされます。
コンテナとタイプを使用してContainerAssignmentのJPA @Id
をコンポジットIDとして定義すると、ContainerAssignmentのサブクラスへの参照が正常に機能します。
ただし、containerIdはIDではないため、entityManager.find(SomeTypeOfContainerAssignment.class, containerId)
はできません。私は@DiscriminatorValue("SOME_TYPE")
のポイントを打ち負かしているようだentityManager.find(SomeTypeOfContainerAssignment.class, new MyPk(containerId, "SOME_TYPE"))
をしなければならない。とにかく検索で型を指定しなければならない場合は、単一のContainerAssignment Entityを使用することもできます。
質問
もちょうどでEntityManager.find
にできることながら、テーブルの主キーが識別カラム上の複合体である単一テーブル継承エンティティのサブクラスへの参照が働いている方法はあります弁別器ではない主キーの部分?
あなたの答えのおかげで、それは本当に問題を解決しない - ちょっとPKの内側 'DiscriminatorColumn'を配置する方法はありますか?私は、人工のPKが最良の選択であることに同意しますが、多くのシステムでは、スキーマを制御することができず、複合PKを処理する必要があります。 –
Bill Karwinの本によると、複合主キーは決して反パターンではありません。 – atorres