做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