1

一部のデータベーステーブルの管理に使用されるJPA/Hibernateコードを維持する必要があります。私はこのようなクラス階層を持っています:

@Entity
@Table(name="table_name")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="column_name", discriminatorType=DiscriminatorType.STRING)
public abstract class AbstractBaseClass {...}

@Entity
@DiscriminatorValue("N")
public class SubClass1 extends AbstractBaseClass { ...}

@Entity
@DiscriminatorValue("Y")
public class SubClass2 extends AbstractBaseClass { ...}

これはすべて正常に機能していますが、データベースが再設計され、識別列が削除され、レコードのタイプがSQLクエリによって決定されます。この再設計は私の考えではなく、データベース構造を制御することはできません。また、既存のコードベースのため、Java階層を変更することも実用的ではありません。すべてが機能し続けるように、DiscriminatorColumn / DiscriminatorValueの代わりに何を使用できますか?

4

2 に答える 2

2

テーブルのデザインにまったく影響がなく、状況が暗いように見えるよりも、将来のデザインが大きな驚きになる場合は:)

ただし、マイナーな変更を加えてもエンティティを使用できる可能性があります。良いニュースは、JPAがSINGLE_TABLE-JOINEDとに加えてさらに2つの継承マッピングモデルを提供していることTABLE_PER_CLASSです。

結合: 抽象テーブルを含め、エンティティごとに1つずつ、合計3つのテーブルが作成されます。テーブルには、それぞれのクラスに含まれている属性が正確に含まれます。さまざまなタイプにアクセスするには、プロバイダーはさまざまなテーブルにアクセス(および結合)する必要があるため、ディスクリミネーター列は必要ありません。

TABLE_PER_CLASS:具体的なサブクラスごとに1つずつ、合計2つのテーブルがあります。それらのそれぞれは、抽象親クラスのすべての属性と独自の属性をマップします。以前と同様に、プロバイダーは個別のテーブルを操作するため、ディスクリミネーターは必要ありません。

移行するには、行を変更する必要があります

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)

どちらかに

@Inheritance(strategy=InheritanceType.JOINED)

また

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

JPQLクエリの良いところは、まったく変更する必要がないことです。JPQL TYPEキーワードを使用するだけで、プロバイダーがすべてのマッピングを行います。

編集:もう1つ-単一のテーブルを処理する必要があるが、識別子がなく、型が結合によって決定される場合は、次のようなJPQLコンストラクター式を使用できます。

SELECT NEW com.example.SubClass1(e.name, e.address) FROM CommonSurrogateEntity e, TypeHintEntity t WHERE t.type = e.foreignKey

これCommonSurrogateEntityは偽のクラスであり、共通のテーブル全体をマッピングします。TypeHintEntityコメントで話していたこの他のテーブルになります。

于 2013-01-21T15:48:27.630 に答える
1

単純なSQL式を使用してディスクリミネーターを判別できる場合は、Hibernate固有の@DiscriminatorFormula拡張機能を使用できます。

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@org.hibernate.annotations.DiscriminatorFormula("(CASE WHEN ... THEN 'SubClass1' ELSE 'SubClass2' END)")
public abstract class AbstractBaseClass {

}

なぜJPA標準にこれが含まれていなかったのかわかりません:-(。

于 2013-01-21T15:58:25.347 に答える