hibernate之 11.many2many双向

表结构:

类图:

CRUD:

User

package com.demo.model;

import java.util.Set;

/**用户信息
 * @author wobendiankun
 *2014-10-29 下午11:05:26
 */
public class User {
	/**
	 *用户Id
	 */
	private int userId;
	/**
	 * 用户名
	 */
	private String userName;
	/**
	 * 密码
	 */
	private String password;

	private Student student ;
	private Set<Role> roles; 

	public User() {
	}

	public User(int userId) {
		this.userId = userId;
	}

	public User(String userName, String password) {
		this.userName = userName;
		this.password = password;
	}

	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Student getStudent() {
		return student;
	}
	public void setStudent(Student student) {
		this.student = student;
	}

	public Set<Role> getRoles() {
		return roles;
	}

	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}

}

Role

package com.demo.model;

import java.util.Set;

/**角色信息
 * @author wobendiankun
 *2014-11-2 下午08:29:54
 */
public class Role {
	/**
	 * 角色id
	 */
	private int roleId;
	/**
	 * 角色名称
	 */
	private String roleName;
	private Set<User> users;

	public Role() {
	}

	public Role(int roleId) {
		this.roleId = roleId;
	}

	public Role(String roleName) {
		this.roleName = roleName;
	}

	public int getRoleId() {
		return roleId;
	}
	public void setRoleId(int roleId) {
		this.roleId = roleId;
	}
	public String getRoleName() {
		return roleName;
	}
	public void setRoleName(String roleName) {
		this.roleName = roleName;
	}
	public Set<User> getUsers() {
		return users;
	}
	public void setUsers(Set<User> users) {
		this.users = users;
	}

}

配置:

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="com.demo.model.User" table="t_user">
		<id name="userId" column="user_id">
			<generator class="sequence">
				<param name="sequence">SEQ_T_USER</param>
			</generator>
		</id>
		<property name="userName" column="user_name" />
		<property name="password" />
		<many-to-one name="student" column="student_id" unique="true"></many-to-one>
		<set name="roles" table="t_user_role" inverse="true">
			<key column="user_id"></key>
			<many-to-many class="com.demo.model.Role" column="role_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

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="com.demo.model.Role" table="t_role">
		<id name="roleId" column="role_id">
			<generator class="sequence">
				<param name="sequence">SEQ_T_ROLE</param>
			</generator>
		</id>
		<property name="roleName" column="role_name" />
		<set name="users" table="t_user_role" lazy="extra">
			<key column="role_id"></key>
			<many-to-many class="com.demo.model.User" column="user_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

add:

@Test
	public void addTest(){
		User user1=new User("赵三","111");
		User user2=new User("无四","111");
		Set<User> users=new HashSet<User>();
		users.add(user1);
		users.add(user2);

		Role role=new Role("财务部");
		Set<Role> roles=new HashSet<Role>();
		//设置双向关系
		role.setUsers(users);
		user1.setRoles(roles);
		user2.setRoles(roles);
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			session.save(role);
			session.save(user1);
			session.save(user2);
			session.getTransaction().commit();
		} catch (Exception e) {
			session.getTransaction().rollback();
			e.printStackTrace();
		} finally {
			HibernateUtil.closeSession(session);
		}
	}

发出sql:

Hibernate: insert into t_role (role_name, role_id) values (?, ?)
Hibernate: insert into t_user (user_name, password, student_id, user_id) values (?, ?, ?, ?)
Hibernate: insert into t_user (user_name, password, student_id, user_id) values (?, ?, ?, ?)
Hibernate: insert into t_user_role (role_id, user_id) values (?, ?)
Hibernate: insert into t_user_role (role_id, user_id) values (?, ?)

load;

@Test
	public void loadTest(){
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			Role role=(Role)session.load(Role.class,3);
			System.out.println("角色名称:"+role.getRoleName());
			System.out.println("users:"+role.getUsers());
			session.getTransaction().commit();
		} catch (Exception e) {
			session.getTransaction().rollback();
			e.printStackTrace();
		} finally {
			HibernateUtil.closeSession(session);
		}
	}

发出sql:

Hibernate: select role0_.role_id as role1_4_0_, role0_.role_name as role2_4_0_ from t_role role0_ where role0_.role_id=?
角色名称:财务部
Hibernate: select users0_.role_id as role2_4_1_, users0_.user_id as user1_1_, user1_.user_id as user1_2_0_, user1_.user_name as user2_2_0_, user1_.password as password2_0_, user1_.student_id as student4_2_0_ from t_user_role users0_ inner join t_user user1_ on users0_.user_id=user1_.user_id where users0_.role_id=?
users:[[email protected], [email protected]]
时间: 2024-10-12 20:50:52

hibernate之 11.many2many双向的相关文章

hibernate它 11.many2many双向

表结构: 类图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd29iZW5kaWFua3Vu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > CRUD: User package com.demo.model; import java.util.Set; /**用户信息 * @author wobendiankun *2014-10-29 下

Hibernate映射多对多双向关联关系(小案例)

多对多双向关联关系(Project(工程)/Emp(员工)为案例): 步骤如下: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project { //编号 private Integer pid; //名称 private String pname; //定义集合类型的Emp属性 private Set<Emp> emps=new HashSet<Emp>(); public Integer getPid() { return pid; }

[原创]java WEB学习笔记83:Hibernate学习之路---双向 1-n介绍,关键点解释,代码实现,set属性介绍(inverse,cascade ,order-by )

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Hibernate四 关联关系之双向关联

双向关联 一 双向1--N关联 1.无连接表的双向1--N关联 N的一端需要使用@ManyToOne注解来修饰代表关联实体的属性,1的一端需要使用@OneToMany注解来修饰代表关联实体的属性. 双向关联应该由N的一端来控制关联关系,因此在使用@OneToMany注解时指定mappedBy属性.一旦为@OneToMany,@ManyToMany指定了该属性,则表明当前实体不能控制关联关系,一旦当前实体放弃控制关联关系后,hibernate就不允许使用@JoinColumn或@JoinTable

hibernate 之 9.one2one双向

在培训系统中,我们经常会为每一个学员,分配一个所属登录帐号,对应的表结构设计如下: 图1:培训系统表结构 t_student: 学员信息表,存储学员的基本信息,如:姓名.年龄.身份证号.地址等等 t_user: 用户表,储系统用户信息,如:登录帐号.密码等 从图1中,知道 它通过student_id来关联 t_studnet 面向对象类关系 CRUD: 配置: User类 package com.demo.model; /**用户信息 * @author wobendiankun *2014-1

Hibernate 建立一对多双向关联关系

以下内容整理自<精通Hibernate>第二版 注:既然是双向关联,"一对多双向关联"和"多对一双向关联"是同一回事. 对象位于内存中,在内存中从一个对象导航到另一个对象显然比到数据库中查询数据的速度快多了.但是复杂的关联关联也会给编程带来麻烦,因此类与类之间是建立单向关联还是双向关联要由业务需求决定. 如果软件应用有大量这样的需求: 1.根据给定的客户,查询该客户的所有订单. 2.根据给定的订单,查询发出订单的客户. 根据以上需求,不妨为Custome

hibernate之7.one2many双向

表结构 实体类关系 实体类源码 Student package com.demo.model; import java.io.UnsupportedEncodingException; import java.util.Set; /**学生信息 * @author wobendiankun *2014-10-19 下午08:54:29 */ public class Student { private int studentId ; private String studentName ; pr

精通Hibernate——映射一对多双向自身关联关系

首先我们来看下图: 每种商品类别代表一个Category对象,每一个Category可以和父列表关联,同时也可以和子类别关联,为了表达这种一对多的双向自身关联关系可以在Category类中定义两个属性: parentCategory:引用父类别对象 childCategories:引用一组子类别对象 下面看看Category的源代码: public class Category implements Serializable{ private Lang id; private String na

Hibernate基于注解的双向one-to-many映射关系的实现

在项目中用到了一对多的实体类关系映射,之前接触的都是基于配置文件的映射实现.可是公司的大部分都是基于注解的.因此自己參考之前的代码捣鼓了基于注解的一对多的映射关系实现. 背景: 一的一端:QingAoCenterInfo:青奥场所信息. 多的一端:QingAoPlaceInfo:青奥场馆信息, 当中一个青奥场所下能够包括多个青奥场馆 one端:QingAoCenterInfo,持有QingAoPlaceInfo的List引用, 通过注解@OneToMany(mappedBy="qingAoCen