0

さて、私が知る限り、JPAで最もよく使用される継承マッピング戦略は2つあります。

  1. 単一のテーブル-すべてのクラス(サブクラスとスーパークラスの両方)が、すべてのクラスのすべてのフィールドを列として持つ単一のテーブルにマップされます。また、一部のサブクラスにのみ固有のフィールドは、他の対応するエントリではNULLです。

@Entity
@Table(name="types")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="types", discriminatorType=DiscriminatorType.STRING, length=1)
public abstract class Base { //... }

@Entity
@DiscriminatorValue(value="A")
public class TypeA extends Base { //... }

@Entity
@DiscriminatorValue(value="B")
public class TypeB extends Base { //... }
  1. 結合テーブル戦略-基本クラス用に1つのテーブルがあり、列としてすべての基本クラスのフィールドと、タイプ用にもう1つの列があります。また、サブクラスごとに特定のテーブルがあり、それぞれに対応するサブクラスのフィールドのみがあり、ベーステーブルと1対1で(PKによって)マップされます。

@Entity
@Table(name="USERS")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="types",discriminatorType=STRING, length=1)
public abstract class Base { //... }

@Entity
@Table(name="SELLERS")
@DiscriminatorValue(value="A")
@PrimaryKeyJoinColumn(name="base_id")
public class TypeA extends User { //... }

@Entity
@Table(name="BIDDERS")
@DiscriminatorValue(value="B")
@PrimaryKeyJoinColumn(name="base_id")
public class TypeB extends User { //... }

私のドメインには、次のクラスがあります。

public abstract class Base {
//data
}

public class TypeA extends Base {
//only one field
}

public class TypeB extends Base {
// many more fields
}

そして、1。TypeAとBaseの間の継承マッピング戦略と2. TypeBとBaseの間の継承マッピング戦略(これは過度に単純化されています。実際には多くのエンティティがあります)。もう1つのフィールドに別のテーブルが必要ないためです。これはJPAで可能ですか?それは意味がありますか?

編集:コードのフォーマットの何が問題なのかわかりません...

4

1 に答える 1

1

いいえ、これはJPAでは不可能です。基本クラスレベルで構成する必要があり@Inheritance、サブクラスレベルでオーバーライドすることはできません。

ただし、オプションには、言及しなかったもう1つの可能性が含まれています。それはInheritanceType.TABLE_PER_CLASSです。これを使用すると、1つまたはN + 1ではなく、N個のテーブル(N個のサブクラス用)が作成されます。また、場合によってはうまく機能します。リンクの長所/短所を参照してください。

于 2013-03-21T15:10:33.943 に答える