2014-02-19 53 views
0

我是JPA和Hibernate的新手。 我能够按预期设置一些小的基本示例。 现在我正在尝试将它用于第一个真实世界的项目。 研究Hibernate的最佳实践我发现你应该避免多对多的关系。我在这里发现了相关的问题,我理解为什么不使用它的概念,但我不理解应该如何实施。休眠 - 避免多对多关联 - 如何实现它?

所以,当我有一个用户的经常使用的例子,可以包含许多组的一部分和一个有很多用户的组时,如何实现它。 所以这是一个多对多的关系。但就我的理解而言,我不应该使用多对多,因为我很可能将来需要其他信息,例如用户在团队中的具体角色或加入时的日期。 因此,我使用两个一对多关系和一个连接表,它不仅包含ID,还包含角色或日期等附加信息。 是吗? 然后 类组都没有属性用户 也不 类用户有一个属性组 都有一个属性joinTableEntries?

到目前为止,我是否掌握了这个概念?

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



    private int userId; 
    private String username; 
    private Set<JTUserGroup> jtUserGroupSet=new HashSet<JTUserGroup>(0); 


    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "userid") 
    public int getUserId() 
    { 
     return this.userId; 
    } 
    public void setUserId(int userId) { 
     this.userId = userId; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user") 
    public Set<JTUserGroup> getJtUserGroupSet() { 
     return jtUserGroupSet; 
    } 


    public void setJtUserGroupSet(Set<JTUserGroup> jtUserGroupSet) { 
     this.jtUserGroupSet = jtUserGroupSet; 
    } 
} 

@Entity 
@Table(name = "forumgroup") 
public class Group { 

    private int groupId; 
    private String groupname; 
    private Set<JTUserGroup> jtUserGroupSet=new HashSet<JTUserGroup>(0); 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "groupid") 
    public int getGroupId() { 
     return groupId; 
    } 

    public void setGroupId(int groupId) { 
     this.groupId = groupId; 
    } 

    public String getGroupname() { 
     return groupname; 
    } 

    public void setGroupname(String groupname) { 
     this.groupname = groupname; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "group") 
    public Set<JTUserGroup> getJtUserGroupSet() { 
     return jtUserGroupSet; 
    } 

    public void setJtUserGroupSet(Set<JTUserGroup> jtUserGroupSet) { 
     this.jtUserGroupSet = jtUserGroupSet; 
    } 


} 

@Entity 
@Table(name = "jtusergroup") 
public class JTUserGroup { 
    private int joinId; 
    private User user; 
    private Group group;`enter code here` 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public int getJoinId() { 
     return joinId; 
    } 

    public void setJoinId(int joinId) { 
     this.joinId = joinId; 
    } 


    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name = "userid", nullable = false) 
    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name = "groupid", nullable = false) 
    public Group getGroup() { 
     return group; 
    } 

    public void setGroup(Group group) { 
     this.group = group; 
    } 

} 

,然后使用这些我一个新的用户添加到组这样的:

User user1=new User(); 
     User user2=new User(); 
     User user3=new User(); 
     Group group1=new Group(); 
     Group group2=new Group(); 


     user1.setUsername("Mark"); 
     user2.setUsername("Anton"); 
     user3.setUsername("Maggy"); 
     group1.setGroupname("Mark_Maggy"); 
     group2.setGroupname("Maggy_Anton"); 

     JTUserGroup jt1=new JTUserGroup(); 
     jt1.setGroup(group1); 
     jt1.setUser(user1); 


     JTUserGroup jt2=new JTUserGroup(); 
     jt2.setGroup(group1); 
     jt2.setUser(user3); 


     JTUserGroup jt3=new JTUserGroup(); 
     jt3.setGroup(group2); 
     jt3.setUser(user3); 


     JTUserGroup jt4=new JTUserGroup(); 
     jt4.setGroup(group2); 
     jt4.setUser(user2); 


     GenericDAO<JTUserGroup> jtDao=new GenericDAO<JTUserGroup>(); 

     jtDao.beginTransaction(); 
     jtDao.insert(jt1); 
     jtDao.insert(jt2); 
     jtDao.insert(jt3); 
     jtDao.insert(jt4); 
     jtDao.commit(); 

回答

0

只是像这种情况,必须User,让我们说,Group是延长您的用户。现在你的'组'有一个子类JTUserGroup。假设UserGroup有一对多的关系(根据您的逻辑,用户可以属于多个组)。现在的问题,User怎么知道JTUserGroup?你需要以某种方式在你的User类中获得FK(因为大家都知道FK与类创建关联)以了解所有'Group'子类并依赖于逻辑,属于(假设)属于几个子类到'Group'。做到这一点并不是不可能,或者你需要制定复杂的解决方案来实现它,而SQL查询又如何 - 它看起来非常复杂。所以你需要以某种方式处理它 - 解决方案是inheritance。这样做可以非常简单地在类之间创建关联。如果你不会有很多信息(或者说复杂的表格模式有很多信息),你可以使用SINGLE_TABLE策略。如果会有很多信息/列(在您的表格中),那么您的数据将不会使用此策略进行标准化,因此更好地使用JOINEDTABLE_PER_CONCRETE_CLASS策略。