5

私は現在、既存の db スキーマを jpa エンティティにマッピングするのに苦労しています。多くの奇妙さの中で、私はこの問題に行き詰まりました。

次のような 2 つのテーブルがあります。

Table 1          Table 2         
|Service     |  |Servicetype     |
|servicetype |  |Servicecategory |
|            |  |                |

servicetype1 は、表 2 のサービス タイプへの外部キーです。ただし、表 1 のサービスは、属するカテゴリに基づいて動作が大きく異なります (100 以上のサービス タイプがありますが、カテゴリは 4 つしかありません)。表 1 を 4 つの異なるものにマッピングできるようにしたいと考えています。サービス タイプのカテゴリに基づくエンティティ クラス。

これは私がこれまでに持っているものです:

@Entity
@Table(name = "table1")
@DiscriminatorColumn(name = "servicecategory", discriminatorType =         
     discriminatorType.INTEGER)
@DiscriminatorValue("1")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@SecondaryTable(name = "table2",
pkJoinColumns =
 @PrimaryKeyJoinColumn(name = "servicetype", referencedColumnName = 
"servicetype"))
public class AbstractService implements Serializable {
...etc

そして、これから拡張する 4 つのクラスdiscriminatorvalueですが、別の .

このようなマッピングを jpa で表現することは可能ですか、それともwhere servicecategory = ?各クエリで " " を使用してマッピングを行う必要があります。

4

1 に答える 1

1

この機能のサポートを追加するには、EclipseLinkに拡張機能を提出してください。JPAソリューションは、プライマリテーブルをセカンダリテーブルに切り替えることです。これにより、挿入順序に問題が発生する可能性がありますが、外部キーはtable2のServicetypeを参照します。

EclipseLink固有のソリューションは、カスタマイザーを使用して、descriminatorフィールドに使用されるテーブルを変更することです。@Customizerタグをエンティティに追加し、メソッドでクラスを指定します。

public void customize(ClassDescriptor descriptor) {
    descriptor.getInheritancePolicy().getClassIndicatorField().setTable(
        descriptor.getTable("table2"));
}
于 2012-11-08T14:55:04.207 に答える