Hibernate的关系映射——Many-To-Many(多对多)
2018-09-17 18:09
162 查看
多对多:多对多的关系至少需要三张表,两张关系表,一张中间表,用来保存两个表之间的关系。
用一个例子来表明多对多的关系:用户、角色以及用户角色。
实际应用中:一个用户可能会有多个角色,而一个角色也会有多个用户,而用户角色则是保存两个表之间关系的一个中间表。
在数据库创建三个表user、role、userrole
首先创建两个实体类,作为中间表的userrole是不用创建实体类的
User实体类
[code]public class User { private String uid; private String uname; private transient Set<Role> sr = new HashSet<>(); public Set<Role> getSr() { return sr; } public void setSr(Set<Role> sr) { this.sr = sr; } public User() { super(); // TODO Auto-generated constructor stub } public User(String uid, String uname) { super(); this.uid = uid; this.uname = uname; } public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } }
Role实体类
[code]public class Role { private String rid; private String rname; private transient Set<User> su = new HashSet<>(); public Set<User> getSu() { return su; } public void setSu(Set<User> su) { this.su = su; } public Role() { super(); // TODO Auto-generated constructor stub } public Role(String rid, String rname) { super(); this.rid = rid; this.rname = rname; } public String getRid() { return rid; } public void setRid(String rid) { this.rid = rid; } public String getRname() { return rname; } public void setRname(String rname) { this.rname = rname; } }
然后创建两个实体类的映射文件
User.hbm.xml
[code]<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2018-9-11 11:29:40 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping> <class name="com.zking.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="uid"></key> <many-to-many class="com.zking.pojo.Role" column="rid"></many-to-many> </set> </class> </hibernate-mapping>
Role.hbm.xml
[code]<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2018-9-11 11:29:40 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping> <class name="com.zking.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="rid"></key> <many-to-many class="com.zking.pojo.User" column="uid"></many-to-many> </set> </class> </hibernate-mapping>
生成一个唯一的Hibernate映射文件(hibernate.cfg.xml)
[code]<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.password">sasa</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/t204?characterEncoding=UTF-8</property> <property name="hibernate.connection.username">root</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <mapping resource="com/zking/pojo/User.hbm.xml" /> <mapping resource="com/zking/pojo/Role.hbm.xml" /> </session-factory> </hibernate-configuration>
大体的创建如下:
最后写一个测试的类(MToM.java)进行级联的增删改查:
[code]public class MToM { @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("admin"); Role r1 = new Role(); r1.setRname("System_Admin"); Role r2 = new Role(); r2.setRname("Admin"); u1.getSr().add(r1); u1.getSr().add(r2); r1.getSu().add(u1); r2.getSu().add(u1); session.save(u1); transaction.commit(); session.close(); sessionFactory.close(); } @Test public void query() { Configuration configuration = new Configuration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); User u1 = session.get(User.class, "647abe95-b575-11e8-bcfa-88d7f6a16255"); String str = JSON.toJSONString(u1); System.out.println(str); session.close(); sessionFactory.close(); } @Test public void update() { Configuration configuration = new Configuration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); User u1 = session.find(User.class, "647abe95-b575-11e8-bcfa-88d7f6a16255"); u1.setUname("user"); session.saveOrUpdate(u1); transaction.commit(); session.close(); sessionFactory.close(); } @Test public void delete() { Configuration configuration = new Configuration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); User u1 = session.find(User.class, "7669c201-b5a9-11e8-bcfa-88d7f6a16255"); Set<Role> sr = u1.getSr(); for (Role role : sr) { role.getSu().remove(u1); } transaction.commit(); session.close(); sessionFactory.close(); } }
阅读更多
相关文章推荐
- Hibernate映射关系解析(三)--Unidirectional associations--one-to-many
- hibernate关系映射--单向多对多@ManyToMany
- Hibernate one-to-many && many-to-many 的关系映射
- Hibernate实体关系映射(OneToMany单边)——完整实例
- hibernate关系映射--双向多对多@ManyToMany
- Hibernate12_映射关系---manyTomany
- Hibernate 关系映射、多对多many to many
- Hibernate关系映射(七)多对多双向关联@ManyToMany Annotation方式
- Hibernate关系映射之many-to-many
- Hibernate 关系映射 many-to-many
- Hibernate 多对多的映射关系(many-to-many)
- Hibernate实体关系映射(OneToMany、ManyToOne双边)——完整实例
- Hibernate 、多表关联映射-多对一关系(many-to-one)
- Hibernate实现many-to-many的映射关系
- Hibernate关系映射(六)多对多单向关联@ManyToMany Annotation方式
- Hibernate 、多表关联映射-多对一关系(many-to-one)
- Hibernate 、多表关联映射-多对一关系(many-to-one)
- Hibernate 、多表关联映射-多对一关系(many-to-one)
- Hibernate关系映射(四)一对多单向关联@OneToMany Annotation方式
- many-to-one/one-to-many/many-to-many关系映射 (Hibernate)