做SSH項目的時候碰到很多關於Hibernate關係映射更新的問題,有些問題在網上翻閱了很多資料也沒找到根本的解決方法,所以記錄下這些問題以作保存!
Hibernate (單向)多對多
業務環境如下:
一個系統有多個角色(role),一個角色對應多個模塊(menu)和多個操作(action),role和menu,action之間單向的多對多關係,即可以從role查詢到menu和action;
建立4個表:t_role表,t_menu表,r_role_menu表,r_role_action表
配置文件如下:
1、POJO類:
public class Role implements Serializable{
private int id;
private String roleName;
private List<Menu> menus=new ArrayList<Menu>();
private List<Action> actions=new ArrayList<Action>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public List<Menu> getMenus() {
return menus;
}
public void setMenus(List<Menu> menus) {
this.menus = menus;
}
public List<Action> getActions() {
return actions;
}
public void setActions(List<Action> actions) {
this.actions = actions;
}
}
public class Menu implements Serializable{
private int id;
private String menuName;
private String menuNum;
private String url;
private String desc;
private Menu parent;
private List<Menu> menus;
private List actions=new ArrayList();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getMenuName() {
return menuName;
}
public void setMenuName(String menuName) {
this.menuName = menuName;
}
public String getMenuNum() {
return menuNum;
}
public void setMenuNum(String menuNum) {
this.menuNum = menuNum;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public Menu getParent() {
return parent;
}
public void setParent(Menu parent) {
this.parent = parent;
}
public List<Menu> getMenus() {
return menus;
}
public void setMenus(List<Menu> menus) {
this.menus = menus;
}
public List getActions() {
return actions;
}
public void setActions(List actions) {
this.actions = actions;
}
}
《*******************************》
2、Hibernate配置文件:
《*******************************》
Role配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="bgi.teamwork.domain">
<class name="Role" table="t_role">
<id name="id" type="integer" column="role_id">
<generator class="native" />
</id>
<property name="roleName" type="string" column="role_name" length="45" />
<list name="menus" table="r_role_menu" inverse="false" lazy="true" cascade="all">
<key column="role_id" />
<list-index column="listindex"/><!-- by super:這裏如果用了list就必須把這個寫在ont to many前,否則報錯 -->
<many-to-many column="menu_id" class="Menu" />
</list>
<list name="actions" table="r_role_action" inverse="false" lazy="true" cascade="all">
<key column="role_id"/>
<list-index column="list_order"/>
<many-to-many class="Action" column="action_id" />
</list>
</class>
</hibernate-mapping>
Menu配置文件:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="bgi.teamwork.domain">
<class name="Menu" table="t_menu">
<id name="id" type="integer" column="menu_id">
<generator class="native" />
</id>
<property name="menuName" type="string" column="menu_name" length="45"/>
<property name="menuNum" type="string" column="menu_num" length="45" />
<property name="url" type="string" column="menu_url" length="200" />
<property name="desc" type="text" column="menu_desc"/>
<many-to-one name="parent" class="Menu" column="parent_id" cascade="delete" />
<list name="menus" table="t_menu" inverse="false" cascade="save-update" >
<key column="parent_id" />
<list-index column="listindex"/>
<one-to-many class="Menu"/>
</list>
<list name="actions" table="t_action" inverse="false" lazy="true" cascade="all" >
<key column="menu_id" not-null="true"/>
<list-index column="list_order"/>
<one-to-many class="Action"/>
</list>
</class>
</hibernate-mapping>
《*******************************》
3、執行插入操作:
《*******************************》
public void testSave() {
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
// create role
Role role = new Role();
role.setRoleName("管理員");
// create menu
Menu menu = new Menu();
menu.setMenuName("人力資源");
// create relationship
role.getMenus().add(menu);
/* 因爲主控方級聯設置爲all,如果設置爲none,則下面被註釋的代碼需要開啓,否則會報錯 */
//session.save(menu);
session.save(role);
//一定要加flush,不然不會執行級聯更新(只會插入role表,而不會插入r_role_menu表),網上大部分資料都沒有該句話
session.flush();
session.getTransaction().commit();
session.close();
}
轉載於:http://blog.csdn.net/kingkuang2006/article/details/6167670