2016-04-10 11 views
0

私はエンティティとテーブルの間でHibernate接続が初めてです。ハイバーネーション接続:@OneToMany、@JoinTableまたは@SecondaryTable?

私は、次のモデルスキーマ(データベース内のエンティティ)を持つようにしたい:

User Seminar SeminarParticipation 
----- ------- -------------------- 
id  id   seminar_id 
name name  user_id 
...  ...  role 

私はエンティティと第三の表は、@ManyToManyによって自動的に作成されcoudことを知っているが、それは追加のフィールドを持っているので、I Javaでのアクセスを容易にする完全なエンティティを持ちたいと考えています。

また、SeminarUserエンティティへの参加を取得したいと考えています。

私の質問は、将来的にDAOで複数のクエリを実行することなく、このエンティティをJavaで簡単にマッピングする方法です。

私はこのアプローチを試してみた:

Seminarクラス(Userが似ている):

@Entity 
@Table(name = "seminars") 
public class Seminar { 

    @Id 
    @GeneratedValue 
    private int id; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    private List<SeminarParticipation> participations; 

    ... 
} 

そしてSeminarParticipationクラス:

@Entity 
@Table(name = "seminar_participations") 
public class SeminarParticipation { 

    @Id 
    @GeneratedValue 
    private int id; 

    @ManyToOne 
    private Seminar seminar; 

    @ManyToOne 
    private User user; 

    @Column(nullable = false) 
    private int role; 

    ... 
} 

をしかし、このコードは、別のテーブルを作成しようと、私の目的はこのエンティティをお互いに一致させることだけです。List<SeminarParticipation>を01に変更すると感謝していますまたはUserは、SeminarDAOまたはUserDAOで作業する場合、SeminarParticipationテーブルのエンティティにも影響します。

私はまた、あなたがスキーマに永続クラスをマッピングするための他のアプローチを持っている必要があり@JoinTableや@SecondaryTableと解決策を見つけましたが、彼らは助けるかもしれI'amわからない...

答えて

0

てきました。

UserおよびSeminarは、参考項目(@OneToManyなし)です。 SeminarParticipationは既に持っているものと同じです。

@Entity 
@Table(name = "seminars") 
public class Seminar { 

    @Id 
    @GeneratedValue 
    private int id; 

} 

@Entity 
@Table(name = "users") 
public class User { 

    @Id 
    @GeneratedValue 
    private int id; 

} 

@Entity 
@Table(name = "seminar_participations") 
public class SeminarParticipation { 

    @Id 
    @GeneratedValue 
    private int id; 

    @ManyToOne 
    private Seminar seminar; 

    @ManyToOne 
    private User user; 

    @Column(nullable = false) 
    private int role; 

} 
1

私はあなたの問題は、しかし@SecondaryTableで正確にわからない馬は間違いないあなたは、このシナリオで使用するものです。

作成したマッピングに問題がある場合は、双方向関係の場合に必須の 'mappedBy'プロパティを指定していないという事実に関連している可能性があります。

http://docs.oracle.com/javaee/5/api/javax/persistence/OneToMany.html#mappedBy()

したがって、ユーザーおよびセミナーは、その@OneToMany団体にmappedByプロパティを指定する必要があります

@OneToMany(mappedBy = "user" ....) 
private List<SeminarParticipation> participations; 

@OneToMany(mappedBy = "seminar" ....) 
private List<SeminarParticipation> participations; 
+0

ありがとうございました。それは助けになった。しかし、私はまだマージカスケードに関連したいくつかの問題があります。このトピックを参照してください:http://stackoverflow.com/questions/36618201/hibernate-merge-does-not-delete-onetomany-old-entities – Luo

関連する問題