2016-08-17 127 views
0

我想創建一個新的用戶(使用實體) - 它通過一個鏈接表成員有參照組(ENTITY2)(ENTITY3)什麼休眠/ JPA註釋需要

用戶擁有一套班子作爲類變量。

當我創建我的用戶對象我想說這個用戶將成爲組的成員(有預先定義的用戶通過編號鏈接到(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); 

我不斷收到錯誤,告訴我,某些列不能爲空我其實希望發生的這裏不是要插入到組表中,而是將用戶關聯到組表中的行。是否有特殊的方法可以防止組表中的列被修改?我想我需要修改鏈接表之間的映射 - 這是多大的POJO如何鏈接現在

用戶

@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; 

發生了什麼是沒有關聯的鏈接會員表如此理想應該用戶有一個一組成員對象而不是一組組?

感謝 - 這是相當難以解釋很抱歉,如果這是很難理解

+0

如果你是休眠,會怎樣您嘗試在'中映射字符串'用戶名' User'和'Group'中的整數'id'?請注意,'Member'在任何情況下都與兩者都沒有關係 - 至少從Hibernate的角度來看並非如此。你可能希望'User'擁有一組'Member'(並且它們具有對'User'的反引用並且是該關係的所有者),並且'Member'與'Group'具有'ManyToOne'關係。 – Thomas

+0

「成員」與任何其他對象沒有關係,所以不是「鏈接表」! –

回答

0

從用戶到組的關係基本上是多對多。您可以使用@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); 
}