なぜ@OneToManyことはできない相Hibernate
-
09-06-2019 - |
質問
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Problem {
@ManyToOne
private Person person;
}
@Entity
@DiscriminatorValue("UP")
public class UglyProblem extends Problem {}
@Entity
public class Person {
@OneToMany(mappedBy="person")
private List< UglyProblem > problems;
}
と思いないといけないことは明らかかっています。期待してい@ManyToOne人に引き継がれUglyProblemクラスです。がこの限りではないようなもの:"などはありませんが判明しUglyProblemクラス(mappedBy="人")".
すべての発見であ この.なかったので、郵便によるエマニュエル-ベルナールを説明する理由です。
残念なことには、Hibernateのドキュメントプロパティはスーパークラスからマップされないと@MappedSuperclassは無視されます。"
もっこしている場合はこれら二つのクラス:
public class A {
private int foo;
}
@Entity
public class B extens A {
}
その分野 foo
ないマッピングのためのクラスBある意味がある。だって思ったこと。
@Entity
public class Problem {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity
public class UglyProblem extends Problem {
private int levelOfUgliness;
public int getLevelOfUgliness() {
return levelOfUgliness;
}
public void setLevelOfUgliness(int levelOfUgliness) {
this.levelOfUgliness = levelOfUgliness;
}
}
期待しているクラスUglyProblemて大概 id
や name
両クラスにマップを用いた。(実際には、これこそが私を確認。との付き合いのなかでこのテーブル:
CREATE TABLE "problem" (
"DTYPE" varchar(31) NOT NULL,
"id" bigint(20) NOT NULL auto_increment,
"name" varchar(255) default NULL,
"levelOfUgliness" int(11) default NULL,
PRIMARY KEY ("id")
) AUTO_INCREMENT=2;
帰私の質問:
期待してい@ManyToOne人に引き継がれUglyProblemクラスです。
ることを期待したいので他のすべてのマップされた分野において受け継がれている理由でこの例外ManyToOne。
ええ、私た。実際に使って読み解決のために私た。私の質問は"しょうか---":).知っていることがあり解説員による冬眠です。また調べることができなかったんです。
知りたいのモチベーションこのデザイン決定します。
(だいが直面したこの問題:った新しいプロジェクト用にhibernate3.またJboss4.0の製品をご用意しています。もの+hibernateあった(までダウンロードすべてのたたずんでいます。またこのプロジェクトをJboss4.2.2としていることが分かったが受け継ぎのマッピングの"@OneToMany mappedBy"で現代美術館などが昔の設定...)
解決
だと思う賢明な決定を経て、Hibernateのチームです。なっている場合には、その少arroganteで明らかに実施されたものですこの方がそれほどエマニュエル-クリスおよびガビンです。:)
いてみようを理解する問題です。行きたいというコンセプト"添い寝".最初と言っている多くの 問題sさずにつくられたペプチド 人.でも、そのひとつと言えるでし 人 多くの UglyProblems(ずつその他の 問題ます。何かが間違っている。
うになるとマップされデータベースです。お持ちのシングルテーブル相続い:
_____________
|__PROBLEMS__| |__PEOPLE__|
|id <PK> | | |
|person <FK> | -------->| |
|problemType | |_________ |
--------------
どのように、hibernateを実施、データベースを 問題 みつ 人 その problemType は等しい。これは非常に難しい問題の課題である。うにしたい場合は、このような関係で、サブクラスが必要である。その @MappedSuperclass
います。
PS.:しまいまして申し訳ありません醜drawing:D
他のヒント
私の場合はを使いたいというのSINGLE_TABLE相続タイプで使用@MappedSuperclassなオプションになります。
何作品ではないものウェブサイトは、サービスを追加する独自のHibernate @場 条項を@OneToMany協会の型問合せ:
@OneToMany(mappedBy="person")
@Where(clause="DTYPE='UP'")
private List< UglyProblem > problems;
残念ながら、Hibernate 文書 "特性はスーパークラスからマップされないと@MappedSuperclassは無視されます。" んでいたことです。私の溶液を代表する希望の継承を通じて界面ではなく、企業の豆ます。
お場合、定義ができるの
public interface Problem {
public Person getPerson();
}
public interface UglyProblem extends Problem {
}
その後実施すこれらのインタフェースを使用する抽象スーパークラスおよび両者のサブクラス:
@MappedSuperclass
public abstract class AbstractProblemImpl implements Problem {
@ManyToOne
private Person person;
public Person getPerson() {
return person;
}
}
@Entity
public class ProblemImpl extends AbstractProblemImpl implements Problem {
}
@Entity
public class UglyProblemImpl extends AbstractProblemImpl implements UglyProblem {
}
加えて、合コード用インタフェースではなく、実際の企業豆を実装する方ェなどが容易に変更を配下のマッピング後に以下のリスクの破れの互換性)
になると思いま注釈を付けお 問題 スーパークラス @MappedSuperclass の代わりに @体.
きっかけになるかもしれないとか、OneToMany mappedBy問題です。
の派生クラスUglyProblemから。コールバックメソッドを、派生クラスの親クラスです。
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@ForceDiscriminator
public class Problem {
}
@Entity
@DiscriminatorValue("UP")
public class UglyProblem extends Problem {
@ManyToOne
private Person person;
}
@Entity
public class Person {
@OneToMany(mappedBy="person")
private List< UglyProblem > problems;
}
この秘伝のタレを使用Hibernate。 http://docs.jboss.org/hibernate/stable/annotations/api/org/hibernate/annotations/ForceDiscriminator.html に@ForceDiscriminatorの@OneToManyの接近検知識別装置
が必要で、Hibernateのアンソロジー。