標籤:os io 檔案 問題 cti 代碼 sp new on
1、由問題引出一個多對多拆分成兩個多對一
問題:Hibernate 關聯映射 之 多對多 關聯(一)中中間表只是一個存放使用者和角色的表,並無其他作用,如果客戶有其他的需求,該表就無法擴充。
2、問題解決過程:
使用者、角色 之間的關係拆分成使用者和使用者角色、角色和使用者角色的關係,即:兩個多對一的關係。
小技巧:如何去判斷多對一還是一對多個物件,要從對象的角度來看,即:從一個對象的角度去看另一個對象。
使用者:
public class User {
private int id;
private String name;
private String password;
private Set<UserRole> roles;
使用者設定檔:
<hibernate-mapping>
<class name="com.shangxuetang.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"></property>
<property name="password"></property>
<set name="roles">
<key column="userID"></key>
<one-to-many class="com.shangxuetang.UserRole"/>
</set>
</class>
</hibernate-mapping>
角色:
public class Role {
private int id;
private String name;
private Set<UserRole> users;
角色設定檔:
<hibernate-mapping>
<class name="com.shangxuetang.Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"></property>
<set name="users">
<key column="roleID"></key>
<one-to-many class="com.shangxuetang.UserRole"/>
</set>
</class>
</hibernate-mapping>
使用者角色:
public class UserRole {
private int id;
private User user;
private Role role;
private Date assignTime;
public UserRole() {}
public UserRole(User u,Role r) {
this.user = u;
this.role = r;
this.assignTime = new Date();
}
使用者角色設定檔:
<hibernate-mapping>
<class name="com.shangxuetang.UserRole" table="t_userrole">
<id name="id">
<generator class="native"/>
</id>
<property name="assignTime" type="date"></property>
<many-to-one name="user" column="userID"></many-to-one>
<many-to-one name="role" column="roleID"></many-to-one>
</class>
</hibernate-mapping>
測試範例程式碼:
public void testManytoManyChaiFen() {
Session session = HibernateUtil.getSession();
try {
session.beginTransaction();
User u1 = new User("zhangsan");
session.save(u1);
User u2 = new User("lisi");
session.save(u2);
Role r1 = new Role("adminstor");
session.save(r1);
Role r2 = new Role("usualuser");
session.save(r2);
Role r3 = new Role("VIPuser");
session.save(r3);
UserRole ur1 = new UserRole(u1,r1);
session.save(ur1);
UserRole ur2 = new UserRole(u1,r2);
session.save(ur2);
UserRole ur3 = new UserRole(u2,r1);
session.save(ur3);
UserRole ur4 = new UserRole(u2,r3);
session.save(ur4);
UserRole ur5 = new UserRole(u2,r2);
session.save(ur5);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
session.close();
}
}
多對多轉化一對多