hibernate之12.many2many变形

多对多关系中,中间表t_user_role不能添加额外的内容,如;创建时间,修改时间,操作员工员等等

我们可以通过另一种方式,多对一来解决.

首先来看一个类图,

图1:用户与角色关系

从图1中,我们发现:

User类与UserRole类是 一对多关系,

Role类与UserRole也是一对多关系

通过UserRole类,我们可得到User类与Role类是多对多关系

CRUD:

UserRole

package com.demo.model;

import java.util.Set;

/**用户角色关系
 * @author wobendiankun
 *2014-11-6 下午10:33:34
 */
public class UserRole {
	private int userRoleId;
	private String operator;
	private User user;
	private Role role;

	public UserRole() {
	}
	public UserRole(String operator) {
		this.operator = operator;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public Role getRole() {
		return role;
	}
	public void setRole(Role role) {
		this.role = role;
	}
	public String getOperator() {
		return operator;
	}
	public void setOperator(String operator) {
		this.operator = operator;
	}
	public int getUserRoleId() {
		return userRoleId;
	}
	public void setUserRoleId(int userRoleId) {
		this.userRoleId = userRoleId;
	}

}

配置

<?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.UserRole" table="t_user_role">
		<id name="userRoleId" column="user_role_id">
			<generator class="sequence">
				<param name="sequence">SQE_T_USER_ROLE</param>
			</generator>
		</id>
		<property name="operator"/>
		<many-to-one name="user" column="user_id"></many-to-one>
		<many-to-one name="role" column="role_id"></many-to-one>
	</class>
</hibernate-mapping>

add:

package com.demo.model;

import org.hibernate.Session;
import org.junit.Test;

import com.demo.util.HibernateUtil;

/**多对多变形
 * @author wobendiankun
 *2014-11-6 下午10:42:34
 */
public class Many2ManyTransTest {
	@Test
	public void addTest(){
		UserRole userRole1=new UserRole("aa");
		userRole1.setUser(new User(61));
		userRole1.setRole(new Role(3));
		UserRole userRole2=new UserRole("bb");
		userRole2.setUser(new User(65));
		userRole2.setRole(new Role(3));

		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			session.save(userRole1);
			session.save(userRole2);
			session.getTransaction().commit();
		} catch (Exception e) {
			session.getTransaction().rollback();
			e.printStackTrace();
		} finally {
			HibernateUtil.closeSession(session);
		}
	}
}

发出sql:

Hibernate: insert into t_user_role (operator, user_id, role_id, user_role_id) values (?, ?, ?, ?)
Hibernate: insert into t_user_role (operator, user_id, role_id, user_role_id) values (?, ?, ?, ?)
时间: 2024-08-07 00:18:22

hibernate之12.many2many变形的相关文章

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;

hibernate之 10.many2many单向

在前文hibernate之5.many2one单向提到多对多关系,表结构设计是基于中间表来实现, 下面以用户与角色(多对多)为例,在Hibernate是如何操作的 表结构设计: 类图: CRUD; Student package com.demo.model; import java.io.UnsupportedEncodingException; import java.util.Set; /**学生信息 * @author wobendiankun *2014-10-19 下午08:54:2

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的Many2One、Many2Many等的使用

本文简单讲述hibernate的Many2One.One2Many和Many2Many的单双向映射的annotation和xml的实现方式. 1.首先,先看下annotation的API文档 2.2.5.2. 多对一(Many-to-one) 在实体属性一级使用@ManyToOne注解来定义多对一关联: @Entity() public class Flight implements Serializable { @ManyToOne( cascade = {CascadeType.PERSIS

Hibernate中,基于Annotation的简单树形结构的实现

在系统设计中,经常用到递归性质的树形结果,比如菜单.多级分类等,一般是在同一个表中定义父子关系实现这种结构. 下面是在Hibernate中,基于Annotation的简单树形结构的实现: 第一步:创建Entity类,并添加注解实现关联关系    ps: 主要是利用@ManyToOne 和 @OneToMany 配置在同一个Entity类中实现树形递归的结构.hibernate注解形式比在xml配置更加简洁 TreeNode.java 1 package com.hfut.hibernate; 2

(十一)Hibernate 高级配置

第一节:配置数据库连接池 反问数据库,需要不断的创建和释放连接,假如访问量大的话,效率比较低级,服务器消耗大: 使用数据库连接池,我们可以根据实际项目的情况,定义连接池的连接个数,从而可以实现从连接池获取连接,用户放回到连接池.从而有效的提高的系统的执行效率: Hibernate 自带的连接池不是很好,有bug: 推荐使用C3P0,proxool 等: C3P0的jar包: 百度云下载:http://pan.baidu.com/s/1jH45002 密码:s391 资料: <!-- 最小连接数

(六)Hibernate 映射类型

所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 第一节:基本类型映射 例子: hibernate.cfg.xml 1 <?xml version='1.0' encoding='utf-8'?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4

Hibernate的1+N问题

Hibernate 1+N 1+N问题的描述:举例,一个帖子(Category)含有多个主题(Topic),多个主题(Topic)属于一个帖子(Category),当只需要查询Topic时不要查询Category时,如果 @ManyToOne的属性fetch=FetchType.EAGER,这时查询所有Topic时,每查询一个Topic就会多产生一个SQL语句查询 相关的Category表的数据,这样要是有N条Topic数据,就会产生1+N条SQL语句.同样的在@OneToMany的情况下,要是

Hibernate 一对多单向关联Demo

以Classes[班级]和Student[学生]为例的Demo Classes .java public class Classes implements Serializable { private long Cid; private String Cname; private String Cdesc; private Set<Student> students; //get和set } Student .java public class Student implements Seria