2016-04-01 4 views
0

私はユーザードメインクラスを持っています。これには2つのユーザータイプがあります。 1つはteacher、もう1つはstudentです。そして、それは2つのフィールドを持っています。一つはteacherInfo、もう一つはstudentInfoです。 teacherユーザーはstudentユーザーとは異なるプロパティを多数持っているため、UserInfoと組み合わせることはできません。それ以外の場合は空のフィールドがたくさんあります。複数のユーザータイプがある場合のuserinfoへのマッピング

したがって、休止状態では、どのように関係をマップする必要がありますか。 One-to-oneを使用する場合は、teacherInfostudentInfoの両方をnullにすることはできません。したがって、教師のユーザーにstudentInfoを割り当ててはいけないので意味がありません。 One-to-many関係はこの問題を解決しますが、配線されているようです。私はただ決定をすることはできません。ありがとう。休止中のSO

public class User { 

    private Integer id; 
    private UserType; 
    private TeacherInfo teacherInfo; 
    private StudentInfo studentInfo; 
} 
+0

でも、このようなアプローチ@Embedded

public class User { @Embedded private TeacherInfo teacherInfo; @Embedded private StudentInfo studentInfo; } 

を使用することができます

public class User { @OneToOne private TeacherInfo teacherInfo; @OneToOne private StudentInfo studentInfo; } 

それを使用することができます抽象的な)クラスのUser、Teacher、Studentを選択し、次にhttp://www.dineshonjava.com/p/implementing-inheritance-in-hibernate.html#.Vv4Xwfmのレシピに従ってくださいたとえば、LTZ4(またはモデルの継承をモデリングするためのオリジナルのドキュメントに従ってください)。 –

答えて

0

、どのように私は関係をマッピングする必要があります。私が1対1を使用する場合は、teacherInfoとstudentInfoの両方をnullにする必要はありません。

間違っています。 @OneToOneの関連付けはnullとなります。だから、あなたは私が正しく質問を理解していれば、1は(の2つのサブクラスを導入すべきである@ManyToOneまたは@OneToOne

class Teacher { 

     @ManyToOne 
     private User user; 

} 

class Student { 

     @ManyToOne 
     private User user; 

} 
+0

あなたの答えをありがとう。 「one-to-oneでは、teacherInfoとstudentInfoの両方がnullにはならない」ということは、遅延読み込み戦略を使用していることを意味します。それはヌルでないことの両方に一対一の関係が必要です。 @OneToOne(optional = false、fetch = FetchType.LAZY、mappedBy = "user"、cascade = CascadeType.ALL) – Tong

+0

@Tong 'optional = false'は使用しないでください。単に '@OneToOne(fetch = FetchType.LAZY、mappedBy =" user "、cascade = CascadeType.ALL)' –

+0

私はそれを使用しないと、ユーザーのstudentInfoとteacherInfoに対して3つのsqlが生成されます。私がこれを使うと、SQLには1つしか参加できません。効率が上がると思います。それじゃない? – Tong

関連する問題