2014-02-19 55 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策略。