2012-11-07 9 views
5

現在、私は既存のDBスキーマをjpaエンティティにマッピングするのに苦労しています。jpaのセカンダリテーブルの識別カラムを使用することは可能です

は、私がこれに似た2つのテーブルを、持っている:

表1で servicetypeが表2でのサービスタイプへの外部キーをある
Table 1   Table 2   
|Service  | |Servicetype  | 
|servicetype | |Servicecategory | 
|   | |    | 

。 しかし、表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、とbuthは、私が使用しているEclipseLinkは、以来、ルックアップしようとしますtable1のservicecategoryの値。

このようなマッピングをjpaで表すことは可能ですか、それとも各クエリで "where servicecategory = ?"というマッピングを行うだけでよいですか。

+0

定義にテーブルと列名を指定しようとしましたか? "table2.servicecategory" – Chris

+0

discriminatorcolumnアノテーションには?はい。しかし、生成されたクエリはすでに別名でテーブルを指定しているので、答えが$ tablealias.table2.servicecategory – vruum

答えて

1

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

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

public void customize(ClassDescriptor descriptor) { 
    descriptor.getInheritancePolicy().getClassIndicatorField().setTable(
     descriptor.getTable("table2")); 
} 
+1

になります。 '@ Customizer'タグは大いに役立ちますが、私たちはスタンダードに固執しようとしています。すでにハイバネーションから切り換えて、プロバイダ固有のものに噛まれています。将来参照するために、私はservicecategoryが結合されたビューを作成し、挿入を別々に処理することになりました。これはほとんどが読み取り専用の表であるためです。 – vruum

関連する問題