2016-04-10 3 views
0

Я новичок в Hibernate соединениях между сущностями и таблицами.Hibernate соединения: @OneToMany, @JoinTable или @SecondaryTable?

Я хочу иметь следующую модельную схему (сущности в базе данных):

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

Я знаю, что третья таблица с сущностями coud создаются автоматически @ManyToMany, но имеет дополнительное поле, так что я хотите иметь полную сущность, чтобы упростить доступ к Java.

Я также хочу получить участие в Seminar и User объектов.

Мой вопрос заключается в том, как наилучшим образом отобразить эти объекты на Java без возможных нескольких запросов в DAO в будущем?

Я попробовал этот подход:

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> в Seminar или User будет влиять на объекты в таблице SeminarParticipation, а также при работе с SeminarDAO или UserDAO.

Я также нашел решение с @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()

Таким образом, Пользователь и семинар должен указать свойство mappedBy на их @OneToMany ассоциаций:

@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

Смежные вопросы