hibernate双向多对多关联映射XML与注解版

来源:互联网 发布:java数字识别 编辑:程序博客网 时间:2024/05/17 02:41

双向多对多关联映射原理:


假设,一个员工可能有多个角色,一个角色可能有多个员工,从员工或角色的角度看,这就是多对多的关系,不管从哪一个角度看,都是多对多的联系。多对多关联映射关系一般采用中间表的形式来实现,即新增一种包含关联双方主键的表。实现多对多关联关系,在数据库底层通过添加中间表指定关联关系,而在HIbernate框架在双方的实体中添加一个保存对方的集合,在双方的映射文件中使用<set>元素和<many-to-many>元素进行关联关系的配置。


如下图所示:




(1)XML版


Role类:

package Hibernate_demo1.Demo15.Entity;import java.util.Set;public class Role {private String id;private String rame;private Set<User> users;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getRame() {return rame;}public void setRame(String rame) {this.rame = rame;}public Set<User> getUsers() {return users;}public void setUsers(Set<User> users) {this.users = users;}}

User类:

package Hibernate_demo1.Demo15.Entity;import java.util.Set;public class User {private String id;private String uname;private Set<Role> roles;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getUname() {return uname;}public void setUname(String uname) {this.uname = uname;}public Set<Role> getRoles() {return roles;}public void setRoles(Set<Role> roles) {this.roles = roles;}}

Role.hbm.xml映射类:

<?xml version="1.0"?>  <!DOCTYPE hibernate-mapping PUBLIC       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  <hibernate-mapping>      <class name="Hibernate_demo1.Demo15.Entity.Role" table="role">          <id name="id" type="java.lang.String">             <column name="id"/>            <generator class="uuid">              </generator>          </id>          <property name="rame" column="rname"/>                <set name="users" table="user_role">              <key column="roleid"></key>              <many-to-many class="Hibernate_demo1.Demo15.Entity.User" column="userid"></many-to-many>          </set>      </class>  </hibernate-mapping>  

User.hbm.xml映射类:

<?xml version="1.0"?>  <!DOCTYPE hibernate-mapping PUBLIC       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  <hibernate-mapping>      <class name="Hibernate_demo1.Demo15.Entity.User" table="user">          <id name="id">              <generator class="uuid">              </generator>          </id>                  <property name="uname" column="uname"/>                    <set name="roles" table="user_role"><key column="userid"/><many-to-many class="Hibernate_demo1.Demo15.Entity.Role" column="roleid" /></set>    </class>  </hibernate-mapping>  

测试类:

package Hibernate_demo1.Demo15;import java.util.HashSet;import java.util.Set;import org.hibernate.Session;import Hibernate_demo1.Demo15.Entity.Role;import Hibernate_demo1.Demo15.Entity.User;import Hibernate_demo1.Demo15.Util.HibernateUtils;public class App {    public static void main( String[] args )    {            Session session = null;    try{                session = HibernateUtils.getSession();        session.beginTransaction();                  Role r1 = new Role();r1.setRame("数据录入人员");session.save(r1);Role r2 = new Role();r2.setRame("商务主管");session.save(r2);Role r3 = new Role();r3.setRame("商务经理");session.save(r3);Role r4 = new Role();r4.setRame("项目会计");session.save(r4);User u1 = new User();u1.setUname("张三");Set<Role> u1Roles = new HashSet<Role>();u1Roles.add(r1);u1Roles.add(r2);u1.setRoles(u1Roles);session.save(u1);User u2 = new User();u2.setUname("李四");Set<Role> u2Roles = new HashSet<Role>();u2Roles.add(r1);u2Roles.add(r2);u2Roles.add(r3);u2.setRoles(u2Roles);session.save(u2);User u3 = new User();u3.setUname("王五");Set<Role> u3Roles = new HashSet<Role>();u3Roles.add(r3);u3Roles.add(r4);u3.setRoles(u3Roles);session.save(u3);               session.getTransaction().commit();      }catch(Exception e){          e.printStackTrace();          session.getTransaction().rollback();      }finally{          HibernateUtils.closeSession(session);      }    }}

执行结果:

Hibernate:     insert     into        role        (rname, id)     values        (?, ?)Hibernate:     insert     into        role        (rname, id)     values        (?, ?)Hibernate:     insert     into        role        (rname, id)     values        (?, ?)Hibernate:     insert     into        role        (rname, id)     values        (?, ?)Hibernate:     insert     into        user        (uname, id)     values        (?, ?)Hibernate:     insert     into        user        (uname, id)     values        (?, ?)Hibernate:     insert     into        user        (uname, id)     values        (?, ?)Hibernate:     insert     into        user_role        (userid, roleid)     values        (?, ?)Hibernate:     insert     into        user_role        (userid, roleid)     values        (?, ?)Hibernate:     insert     into        user_role        (userid, roleid)     values        (?, ?)Hibernate:     insert     into        user_role        (userid, roleid)     values        (?, ?)Hibernate:     insert     into        user_role        (userid, roleid)     values        (?, ?)Hibernate:     insert     into        user_role        (userid, roleid)     values        (?, ?)Hibernate:     insert     into        user_role        (userid, roleid)     values        (?, ?)

数据库内容为:


user表:


role表:


user_role表:



示例:http://download.csdn.net/detail/u011781521/9835781


(2)注解版


Role类:

package Hibernate_demo1.Demo16.Entity;import java.util.HashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.ManyToMany;import javax.persistence.Table;import org.hibernate.annotations.GenericGenerator;@Entity@Table(name="role")public class Role {@Id        @GenericGenerator(name="uuidGenerator", strategy="uuid")        @GeneratedValue(generator="uuidGenerator")private String id;@Column(name="rname")private String rame;@ManyToMany(cascade=CascadeType.REFRESH,mappedBy="roles")private Set<User> users=new HashSet<User>();public String getId() {return id;}public void setId(String id) {this.id = id;}public String getRame() {return rame;}public void setRame(String rame) {this.rame = rame;}public Set<User> getUsers() {return users;}public void setUsers(Set<User> users) {this.users = users;}}

User类:

package Hibernate_demo1.Demo16.Entity;import java.util.HashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;import javax.persistence.Table;import javax.persistence.JoinColumn;import org.hibernate.annotations.GenericGenerator;@Entity@Table(name="user")public class User {@Id        @GenericGenerator(name="uuidGenerator", strategy="uuid")        @GeneratedValue(generator="uuidGenerator")private String id;@Column(name="uname")private String uname;/* * @ManyToMany表示多对多关联,对于这种关联极少数情况会使用级联删除,我这里设置的是级联刷新; * 因为有中间表的存在这里使用@JoinTable来设置关联表后面的name配置的是关联表的名称 * inverseJoinColumn配置的是关系被维护一方主键对应的中间表字段 * joinColumn配置的是关系维护方主键对应的中间表字段。 */@ManyToMany(cascade=CascadeType.REFRESH)@JoinTable(name="user_role",inverseJoinColumns=@JoinColumn(name="roleid"),joinColumns=@JoinColumn(name="userid"))private Set<Role> roles=new HashSet<Role>();public String getId() {return id;}public void setId(String id) {this.id = id;}public String getUname() {return uname;}public void setUname(String uname) {this.uname = uname;}public Set<Role> getRoles() {return roles;}public void setRoles(Set<Role> roles) {this.roles = roles;}}

测试类:

package Hibernate_demo1.Demo16;import java.util.HashSet;import java.util.Set;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import Hibernate_demo1.Demo16.Entity.Role;import Hibernate_demo1.Demo16.Entity.User;public class Test {public static void main(String[] args) {    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();      Session session = sessionFactory.getCurrentSession();      Transaction tx = session.beginTransaction();                 //创建两个用户        User us1=new User();        us1.setUname("小明");                User us2=new User();        us2.setUname("小黑");            //创建用户集合        Set<User> su=new HashSet<User>();        su.add(us1);        su.add(us2);                        //创建两个角色        Role ro1=new Role();        ro1.setRame("程序员");        ro1.setUsers(su);                Role ro2=new Role();        ro2.setRame("技术经理");        ro2.setUsers(su);                        //创建角色集合        Set<Role> sr=new HashSet<Role>();        sr.add(ro1);        sr.add(ro2);                //往用户添加角色集合        us1.setRoles(sr);        us2.setRoles(sr);                //保存用户和角色        session.save(us1);        session.save(us2);        session.save(ro1);        session.save(ro2);                    tx.commit();        session.close();}}

执行结果如下:

Hibernate:     insert     into        user        (uname, id)     values        (?, ?)Hibernate:     insert     into        user        (uname, id)     values        (?, ?)Hibernate:     insert     into        role        (rname, id)     values        (?, ?)Hibernate:     insert     into        role        (rname, id)     values        (?, ?)Hibernate:     insert     into        user_role        (userid, roleid)     values        (?, ?)Hibernate:     insert     into        user_role        (userid, roleid)     values        (?, ?)Hibernate:     insert     into        user_role        (userid, roleid)     values        (?, ?)Hibernate:     insert     into        user_role        (userid, roleid)     values        (?, ?)

示例:http://download.csdn.net/detail/u011781521/9835795

0 0
原创粉丝点击