我建了五张表,user,role,menu,以及三张表的中间表——userrole,menurole。
只要建user,role,menu表的实体类,中间表不需要建立实体类,两张表如果有关系,则需要在实体类中加入Set集合,类型是对方的类型。
然后建立hbm.xml
user.hbm.xml:
<class name="com.pojo.user" table="USER">
<id name="uid" type="java.lang.String">
<column name="UID" />
<generator class="guid" />
</id>
<property name="uname" type="java.lang.String">
<column name="UNAME" />
</property>
<set name="sr" table="userrole" inverse="true" cascade="save-update" >
<key>
<column name="UID" />
</key>
<many-to-many class="com.pojo.role" column="rid"/>
</set>
</class>
role.hbm.xml:
<class name="com.pojo.role" table="ROLE">
<id name="rid" type="java.lang.String">
<column name="RID" />
<generator class="guid" />
</id>
<property name="rname" type="java.lang.String">
<column name="RNAME" />
</property>
<set name="su" table="userrole" >
<key>
<column name="RID" />
</key>
<many-to-many class="com.pojo.user" column="uid"/>
</set>
<set name="sm" table="rolemenu" inverse="true" cascade="save-update">
<key>
<column name="RID" />
</key>
<many-to-many class="com.pojo.menu" column="mid"/>
</set>
</class>
menu.hbm.xml:
<class name="com.pojo.menu" table="MENU">
<id name="mid" type="java.lang.String">
<column name="MID" />
<generator class="guid" />
</id>
<property name="mname" type="java.lang.String">
<column name="MNAME" />
</property>
<set name="sr" table="rolemenu" >
<key>
<column name="MID" />
</key>
<many-to-many class="com.pojo.role" column="rid"/>
</set>
</class>
只有主代理才需要写级联关系,而且不能写all,不然会将所有表的数据全部删除。
接下来就是test类add方法:
@Test
public void add() {
Configuration configuration=new Configuration().configure();
SessionFactory sessionFactory=configuration.buildSessionFactory();
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction();
//添加数据
user u1=new user();
u1.setUname("ls");
role r1=new role();
r1.setRname("zd");
menu m1=new menu();
m1.setMname("m1");
//互设
u1.getSr().add(r1);
r1.getSu().add(u1);
r1.getSm().add(m1);
m1.getSr().add(r1);
session.save(u1);
//关系
transaction.commit();
session.close();
sessionFactory.close();
}
test的删除方法:
@Test
public void delete() {
Configuration configuration=new Configuration().configure();
SessionFactory sessionFactory=configuration.buildSessionFactory();
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction();
//找到user对象
user u1=session.get(user.class, "8814c94c-b5ba-11e8-b79f-54e1ad4df251");
//得到user中的所有role
Set<role> sr=u1.getSr();
//foreach循环,在角色也就是role中将user移除
for (role role : sr) {
role.getSu().remove(u1);
}
transaction.commit();
session.close();
sessionFactory.close();
}
查询的方法和之前的1对多是一样的,可以参考我之前的博客。
修改角色的话,先调用删除的方法将该user的角色删除,然后调用增加的方法,为其增加一个新的角色。