@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="person") にそのようなプロパティは見つかりません」というような例外が発生します。
私が見つけたのはこれだけです。この背後にある理由を説明する Emmanuel Bernard の投稿を見つけることができませんでした。
残念ながら、Hibernate のドキュメントによると、「 @MappedSuperclass としてマップされていないスーパークラスのプロパティは無視されます。」
これは、これら2つのクラスがある場合、次のことを意味すると思います。
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 の関係に対してこの例外を作成する理由が見当たらないため、私はそれを期待しています。
ええ、私はそれを見ました。実際、私の場合は読み取り専用ソリューションを使用しました。しかし、私の質問は「なぜ...」でした:)。休止状態チームのメンバーによる説明があることを知っています。見つけられなかったので質問させていただきました。
このデザイン決定の動機を知りたいです。
(私がこの問題にどのように直面したかに興味がある場合:hibernate 3を使用して構築されたプロジェクトを継承しました。それはJboss 4.0.something + hibernateがすでにそこにありました(すべて一緒にダウンロードします)。私はこのプロジェクトをJboss 4.2に移動していました。 2 そして、「@OneToMany mappedBy」の継承されたマッピングがあり、古いセットアップで正常に機能することがわかりました...)