状況
DiscriminatorColumn
単一テーブル継承用に構成された、を持つエンティティがあります。
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE")
public class ContainerAssignment{
...
}
'ContainerAssignment'には、別のエンティティへの参照があります。
@JoinColumn(name="CONTAINER_ID")
private Container container;
コンテナにはContainerAssignment
、各TYPEの1つが含まれる場合があります。これは、テーブルの主キーがとContainerAssignment
によって定義されることを意味します。CONTAINER_ID
TYPE
ContainerAssignment
いくつかのサブクラスがあります。
@Entity
@DiscriminatorValue("SOME_TYPE")
public class SomeTypeOfContainerAssignment extends ContainerAssignment{
...
}
SomeTypeOfContainerAssignment
特定のに対して1つのインスタンスのみが存在しますCONTAINER_ID
。
問題
JPA@Id
をContainerAssignmentテーブルのContainerとして定義すると、実行できますentityManager.find(SomeTypeOfContainerAssignment.class, containerId)
。これはすばらしいことです。これは、の線に沿って何かを実行しますSELECT * FROM CONTAINER_ASSIGNMENT WHERE CONTAINER_ID = 1 AND TYPE = 'SOME_TYPE';
。@DiscriminatorValue("SOME_TYPE")
エンティティに注釈があるため、ここでTYPEチェックが必要であることを認識しています。
ただし、これは、Containerが実際には主キーではないため、ContainerからContainerAssignmentへの逆参照が壊れることを意味します。たとえば、Containerにが含まれている場合、コンテナ@OneToOne(mappedBy=container) private SomeTypeOfContainerAssignment assignment;
を読み込むとSELECT * FROM CONTAINER_ASSIGNMENT WHERE CONTAINER_ID = 1;
、型チェックなしで、のようなものによって割り当てが読み込まれます。これにより、コンテナのすべての割り当てが与えられ、次に、一見ランダムに見えるものを選択します。タイプが間違っている可能性があります。その場合、例外がスローされます。
代わりに、ContainerAssignmentのJPA@Id
をcontainerとtypeを使用した複合IDとして定義すると、ContainerAssignmentのサブクラスへの参照は正常に機能します。
ただし、entityManager.find(SomeTypeOfContainerAssignment.class, containerId)
containerIdはIDではないため、実行できません。私がしなければならないentityManager.find(SomeTypeOfContainerAssignment.class, new MyPk(containerId, "SOME_TYPE"))
、それはのポイントを打ち負かすようです@DiscriminatorValue("SOME_TYPE")
。とにかく検索時にタイプを指定する必要がある場合は、単一のContainerAssignmentエンティティを使用する方がよいでしょう。
質問
単一テーブル継承エンティティのサブクラスへの作業参照を持つ方法はありますか?テーブルの主キーがディスクリミネーター列で複合されている一方EntityManager.find
で、主キーの一部だけで参照できる方法はありますか?弁別者ではありませんか?