2016-08-17 3 views
0

Я пытаюсь создать новый пользователь (entity1) - это имеет отношение к группе (entity2) с помощью таблицы ссылки члена (entity3)Что спящий режим/JPA аннотация требуется

Пользователя имеет набор групп как переменную класса.

Когда я создаю свой объект пользователя, я хочу сказать, что этот пользователь будет членом группы n (есть предварительно определенные пользователи, к которым привязан идентификатор (1,2,3,4,5,6 ...) каждая группа имеет некоторые связанные с ним данные в таблице

Всякий раз, когда я создаю мой пользовательский объект следующим образом..

User user = new User(); 
user.setActive(1); 
user.setCrby("me"); 
user.setUsername("username"); 
user.setCrdate("2016-06-20 12:42:53.610"); 
user.setCrwsref("..."); 
user.setModby("..."); 
user.setModdate("2016-06-20 12:42:53.610"); 
user.setModswref(".."); 
user.setBackground("Y"); 
user.setPassword("password"); 
user.setFullName("me"); 

Group group = new Group(); 
group.setId(1); 

Group group2 = new Group(); 
group2.setId(2); 

Set<Group> sets = new HashSet<Group>(); 
sets.add(group); 
sets.add(group2); 

user.setGroups(sets); 

userDao.addUser(user); 

Я постоянно получаю ошибки говоря мне, что некоторые столбцы не может быть пустым, что я на самом деле хочу, чтобы это произошло здесь не нужно вставлять в таблицу групп, а связывать пользователя с линией в таблице групп. Есть ли способ предотвратить изменение столбцов в таблице групп? Я думаю, что нужно изменить сопоставление между таблицей ссылок - это сколько POJOs ссылка прямо сейчас

пользователем

@Entity 
@Table(name = "user") 
public class User 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 

    @Column(name = "username") 
    private String username; 

    @Column(name = "password") 
    private String password; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinTable(name = "zmember", joinColumns = {@JoinColumn(name = "username")}, inverseJoinColumns = {@JoinColumn(name = "id")}) 
    private Set<Group> groups = new HashSet<Group>(0); 

таблицей ссылки Участник

@Entity 
@Table(name = "member") 
public class Member implements Serializable 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 

    @Id 
    @Column(name = "sgpid") 
    private int sgpid; 

    @Column(name = "username") 
    private String memberUsername; 

Группы

@Entity 
@Table(name = "group") 
public class Group 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 

Что происходит, нет никакой ассоциации с таблицей Member link, поэтому идеально должно быть у пользователя набор объектов-членов, а не набор групп?

Спасибо - это было довольно трудно объяснить, так жаль, если это трудно понять

+0

Если вы Hibernate, как бы вы пытаетесь отобразить строку 'username' в' User' и целое 'id' в' Group'? Обратите внимание, что 'Member' не связан ни с одним, ни с другим - по крайней мере, с точки зрения Hibernate. Вероятно, вы хотите, чтобы 'User' имел набор' Member' (и у них есть обратная ссылка на 'User' и являются владельцами отношения), а' Member' имеет отношение 'ManyToOne' к' Group' , – Thomas

+0

«Участник» не имеет отношения ни к одному другому объекту, поэтому не является «таблицей ссылок»! –

ответ

0

Отношения с Пользователем Группы по существу ManyToMany. Вы могли бы моделировать это, используя аннотацию @ManyToMany, однако один из недостатков этого подхода заключается в том, что вы не можете сохранять дополнительную информацию о группе в таблице соединений, например «date_joined».

См: https://en.wikibooks.org/wiki/Java_Persistence/ManyToMany#ManyToMany

Используя этот подход, вам не нужно будет Соединить лицо член и отношения на пользователе будет выглядеть так:

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinTable(name = "zmember", joinColumns = {@JoinColumn(name = "member_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "group_id", referencedColumnName = "id")}) 
private Set<Group> groups = new HashSet<Group>(0); 

Альтернативы использованию @ManyToMany является использование регистрации лица Член (корабль), как вы это делали. Это позволит вам сохранить дополнительные данные о связи (путем определения дополнительных сопоставлений полей в сущности Join).

В этом случае отображения будет выглядеть следующим образом:

Пользователь:

public class User{ 
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Set<Membership> memberships = new HashSet<Membership>(0); 

    //if required, you can 'hide' the join entity from client code by  
    //encapsulating add remove operations etc. 

    public void addToGroup(Group group){ 
     Membership membershup = new Membership(); 
     membership.setUser(this); 
     membership.setGroup(group); 
     memberships.add(membership); 
    ) 

    public Set<Groupp> getGroups(){ 
     //iterate memberships and build collection of groups 
    } 
} 

Членство:

public class Membership{ 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 

    @ManyToOne 
    @JoinColumn(name = "user_id") 
    private Member member; 

    @ManyToOne 
    @JoinColumn(name = "group_id") 
    private Group group; 
} 

Группа:

@Entity 
@Table(name = "group") 
public class Group 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 

    @OneToMany(mappedBy = "group", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Set<Membership> memberships = new HashSet<Membership>(0); 
} 
Смежные вопросы