2013-03-19 13 views
5
@MappedSuperclass 
public abstract class AbstractBaseModel{ } 

@MappedSuperclass 
public class Person extends AbstractBaseModel { } 

@Entity 
public class APerson extends Person { } 

@Entity 
public class BPerson extends Person { } 

@Entity 
public class Course extends AbstractBaseModel { 
    @ManyToOne 
    @JoinColumn(name ="person") 
    private Person person; 
} 

で注釈を付けたエンティティを参照します。どのように私はそのような継承のシナリオを達成するのですか?Hibernateは継承は、例外を与える構造上@MappedSuperclass

答えて

4

シンプルな、あなたはPerson

@Entityへの使用を明示的にクラスが照会可能になりたい、または関係の一部ではありませんだけ @MappedSuperclass@MappedSuperclass注釈を変更します。 @Entity他のすべて。決定する

良いヒューリスティックは、あなたのスーパークラスがabstractあるかどうかを確認することである - それがある場合 - あなたはその場合AbstractBaseModel

+0

に行ったように、@MappedSuperclassを使用し、休止状態はPersonクラスを作成します。 APersonやBPersonは作成されませんでした。 PersonエンティティがAPersonとBPersonをマージしました。 – user706071

+0

@ user706071 - あなたは何を意味するのか分かりません。 Hibernateはクラスを生成しません。 APersonとBPersonはPersonとどう違うのですか?彼らは追加の属性を持たず、違いは行動に過ぎないのだろうか? – kostja

+0

APersonクラスとBPersonクラスには、共通の属性(Person)以外の独自の属性があります。とにかく、返事をありがとう。あなたが提案するアプローチを使用します。 Hibernateは、Personという名前のテーブルを作成し、APersonとBPersonのすべての属性をマージし、DTYPE属性を追加してサブクラスタイプを区別しました。私のAPersonとBPersonはあまり変わらないので、この種の継承は私にも当てはまります。 – user706071

0
@Entity 
@Table(name="PERSON") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="discriminator",discriminatorType=DiscriminatorType.STRING) 
public absract class Person extends AbstractBaseModel { } 

@Entity 
public class APerson extends Person { } 

@Entity 
public class BPerson extends Person { } 

@Entity 
public class Course extends AbstractBaseModel { 
    @ManyToOne 
    @JoinColumn(name ="person", **insertable = false, updatable = false**) 
    private Person person; 
}