2013-10-14 180 views
0

我已经对我的模型做了必要的更改概述here。但是,我不知道要在我的连接表实体上放什么。休眠多对多映射,加入PK和额外的列表

请注意,我的连接表有一个代理键和两个额外的列(date和varchar)。

到目前为止,我已经得到了什么是:

User.java

@Entity 
@Table (name = "tbl_bo_gui_user") 
@DynamicInsert 
@DynamicUpdate 
public class User implements Serializable { 
    private String id; 
    private String ntName; 
    private String email; 
    private Set<GroupUser> groupUsers = new HashSet<GroupUser>(0); 

    // Constructors and some getters setters omitted 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.user", cascade=CascadeType.ALL) 
    public Set<GroupUser> getGroupUsers() { 
     return groupUsers; 
    } 

    public void setGroupUsers(Set<GroupUser> groupUsers) { 
     this.groupUsers = groupUsers; 
    } 
} 

Group.java

@Entity 
@Table (name = "tbl_bo_gui_group") 
@DynamicInsert 
@DynamicUpdate 
public class Group implements Serializable { 
    private String id; 
    private String groupName; 
    private String groupDesc; 
    private Set<GroupUser> groupUsers = new HashSet<GroupUser>(0); 

    // Constructors and some getters setters omitted 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.group", cascade=CascadeType.ALL) 
    public Set<GroupUser> getGroupUsers() { 
     return groupUsers; 
    } 

    public void setGroupUsers(Set<GroupUser> groupUsers) { 
     this.groupUsers = groupUsers; 
    } 
} 

的问题是,我不知道该穿什么我的连接表实体。这里是。

GroupUser.java

@Entity 
@Table (name = "tbl_bo_gui_group_user") 
@DynamicInsert 
@DynamicUpdate 
@AssociationOverrides({ 
    @AssociationOverride(name = "pk.user", 
      joinColumns = @JoinColumn(name = "id")), 
    @AssociationOverride(name = "pk.group", 
      joinColumns = @JoinColumn(name = "id")) }) 
public class GroupUser implements Serializable { 
    private String id; 
    private User userId; 
    private Group groupId; 
    private Date dateCreated; 
    private String createdBy; 

    // constructors and getters and setters for each property 

    // What now? ? No idea 
} 

回答

1

用户组将是Many-To-Many关系。现在,你正在把它分解成两个关系One-To-Many。因此,你的映射实体简单的需求来完成Many-To-Many关系,通过使用Many-To-One

public class GroupUser implements Serializable { 
    private String id; 

    @ManyToOne 
    private User userId; 

    @ManyToOne 
    private Group groupId; 
    private Date dateCreated; 
    private String createdBy; 
} 

参见下面的例子:Mapping many-to-many association table with extra column(s)(在38个upvotes答案)

+0

我怎么会写的方法保存的数据连接表模型中的用户和组?在你提供的链接上有'userService.setUser(user);',但它没有显示我正在寻找的连接表实体的完整想法。顺便说一句,我是一个hibernate新手。 – makalshrek

+0

@SciasTwentyThree如果你的实体*设置正确*你不需要关心。即:一个用户,5个映射,5个组和每个组有10个额外的属性:调用'userService.save(user)'和hibernate将持续所有61个实体(1个用户+5映射+5组+10个属性/ 50)),因为它们是“连接”的。 – dognose