0

フォーラムで同様の質問を探しましたが、探しているものに対処するものは見つかりませんでした (少なくとも私が言えること)。

それぞれ複数のリクエスト タイプを持つ複数のクライアントがある状況があります。私が達成しようとしていたのは、各クライアントの子テーブル「ClientARequest」、「ClientBRequest」に分割される親テーブル「Request」を持つことでした。そこから、同じクライアント テーブルにマップする複数のクラスを作成します。「ClientARequest1」と「ClientARequest2」はどちらも「ClientARequest」にマップされ、ClientB についても同様です。JOINED 継承で最初の部分を問題なく動作させることができます。保存のために2番目の作業も行うことができます。ただし、フェッチするとき、休止状態は最後にマップされたクラスのインスタンスを作成しているため、フェッチしたオブジェクトの使用方法に応じて、ClassCastException が発生するか、間違ったクラスであるため正しいデータが得られません。

@Entity(name="Request")
@Table(name = "REQUEST")
@Inheritance(strategy=InheritanceType.JOINED)  
@DiscriminatorColumn(name="MY_TYPE", discriminatorType=DiscriminatorType.STRING)
public class Request  { ... }

@Entity(name="ClientARequest1")
@Table(name = "CLIENTAREQUEST")
@DiscriminatorValue("ClientA")
public class ClientARequest1 extends Request { ... }

@Entity(name="ClientARequest2")
@Table(name = "CLIENTAREQUEST")
@DiscriminatorValue("ClientA")
public class ClientARequest2 extends Request { ... }

ClientB についても同じです。

@Entity(name="ClientBRequest1")
@Table(name = "CLIENTBREQUEST")
@DiscriminatorValue("ClientB")
public class ClientBRequest1 extends Request { ... }

@Entity(name="ClientBRequest2")
@Table(name = "CLIENTBREQUEST")
@DiscriminatorValue("ClientB")
public class ClientBRequest2 extends Request { ... }

したがって、前述したように、Request、ClientARequest、ClientBRequest の 3 つのテーブルが作成され、テーブル間の識別に問題はありません。Hibernate が 2 番目のマッピングを使用してクラスのインスタンスを作成するのは、テーブルからフェッチしようとするときです。

元。

ClientARequest1 r = new ClientARequest1("ClientA");
dao.save(r);

期待どおりに動作します。
ただし、次の場合:

Request r = (Request) dao.findById(1l);  //where id==1 is a ClientARequest1

実際には ClientARequest2 を引き戻します。

どんな考えでも大歓迎です。この解決策は実行可能ではありませんか?テーブルを別のレベルに分割する方法はありますか?

2013 年 2 月 26 日 11:19 AM EST:
このスレッドで解決策を試みました。継承戦略と JPA アノテーションおよび Hibernate を混在させる方法は? 、しかし、サブクラス BB1、BB2、CC1、CC2 を適切にマップできませんでした。それらのプロパティは基本親テーブル A に配置されるためです。それらのプロパティを直接の親テーブル BB、CC にそれぞれ配置する必要があります。

4

1 に答える 1

0

わかった。How to mix inheritance strategy with JPA annotations and Hibernate? にある解決策に従いました。. 私が変更したのは、@MappedSuperclass を BB、CC レベルに追加し、@Entity と @SecondaryTable を BB1、BB2、CC1、CC2 レベルに移動したことだけです。

于 2013-02-26T19:19:21.140 に答える