Hibernate 多对多配置和操作

    这里以用户和角色为例

    第一步创建两个实体类用户和角色,并让两个实体类互相表示,Hibernate中用Set集合表示

   用户实体类

package com.netxintai.mary;

import java.util.HashSet;
import java.util.Set;

public class User {
	
	private Integer u_id;
	private String username;
	private String address;
	private String phone;
	
	private Set<Role> setRole=new HashSet<Role>();

	public Integer getU_id() {
		return u_id;
	}

	public void setU_id(Integer u_id) {
		this.u_id = u_id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public Set<Role> getSetRole() {
		return setRole;
	}

	public void setSetRole(Set<Role> setRole) {
		this.setRole = setRole;
	}
	
	

}

    角色类

package com.netxintai.mary;

import java.util.HashSet;
import java.util.Set;

public class Role {
	
	private Integer r_id;
	private  String role_name;
	private String role_level;
	private Set<User> setUser=new HashSet<User>();
	public Integer getR_id() {
		return r_id;
	}
	public void setR_id(Integer r_id) {
		this.r_id = r_id;
	}
	public String getRole_name() {
		return role_name;
	}
	public void setRole_name(String role_name) {
		this.role_name = role_name;
	}
	public String getRole_level() {
		return role_level;
	}
	public void setRole_level(String role_level) {
		this.role_level = role_level;
	}
	public Set<User> getSetUser() {
		return setUser;
	}
	public void setSetUser(Set<User> setUser) {
		this.setUser = setUser;
	} 
	
	
	

}

    第二步配置两个实体类的映射文件

    用户User类配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.netxintai.mary.User" table="t_user">
		<id name="u_id" column="u_id">
			<generator class="native"></generator>
		</id>
		<property name="username" column="username" />
		<property name="address" column="address" />
		<property name="phone" column="phone" />
		
		<!-- 
				在用户里面表示所有角色,使用set标签
				name属性:角色set集合名称
				table属性:第三章表名称
		 -->
	<set name="setRole" table="user_role">
		<!-- Key 标签里面配置
			配置当日前映射文件在第三章表外键名称
			 -->
		<key column="userid"></key>
			<!-- 
				class:橘色实体类全路径
				column:橘色在第三章表中外键名称	
			 -->
	<many-to-many class="com.netxintai.mary.Role" column="roleid"></many-to-many>
	</set>

	</class>

</hibernate-mapping>

     角色类配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.netxintai.mary.Role" table="t_role">
		<id name="r_id" column="r_id">
			<generator class="native"></generator>
		</id>
		<property name="role_name" column="role_name" />
		<property name="role_level" column="role_level" />
	<!-- 在角色里面表示所有用户,使用set标签 -->
	<set name="setUser" table="user_role" cascade="save-update">
	<!-- 角色在第三张表外键 -->
	<key column="roleid"></key>
	
	<many-to-many class="com.netxintai.mary.User" column="userid"></many-to-many>
	</set>

	</class>

</hibernate-mapping>

    第三步 将配置文件引入hibernate.cfg.xml

<?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.url">jdbc:mysql:///mydb</property>
	<property name="hibernate.connection.username">root</property>
	<property name="hibernate.connection.password">123</property>
	
	<!-- 配置hibernate信息 可选 -->
	<!-- 输出sql语句-->
	<property name="hibernate.show_sql">true</property>  
	<!-- 格式化sql语句 -->
	<property name="hibernate.format_sql">true</property>
	<!-- hibernate帮创建表 需要配置后
		update:如果已经存在表,更新,如果没有 创建表
	 -->
	<property name="hibernate.hbm2ddl.auto">update</property>
	<!-- 配置数据库方言 -->
	<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
	<!-- 把映射文件放到核心配置文件中 -->
	<property name="hibernate.current_session_context_class">thread</property>
	<!-- 引入配置文件 -->
	
	<mapping resource="com/netxintai/mary/Role.hbm.xml"/>
	<mapping resource="com/netxintai/mary/User.hbm.xml"/>

	</session-factory>

</hibernate-configuration>

   第四步 进行测试代码

package com.netxintai.dome;

import java.util.Set;

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

import com.netxintai.mary.Role;
import com.netxintai.mary.User;
import com.netxintai.utils.HiberntaeUtils;

public class DomeTEST {

	private SessionFactory sessionFactory;
	private Session session;
	private Transaction tr;

	@Test
	public void DomeTest() {

		try {

			sessionFactory = HiberntaeUtils.getsessionFactory();
			session = sessionFactory.openSession();
			tr = session.beginTransaction();

	
			User user=new User();
			Role role=new Role();
			Role role2=new Role();
			
			user.setAddress("北京");
			user.setUsername("朱棣");
			user.setPhone("999999");
			
			role.setRole_level("1");
			role.setRole_name("超级管理员");
			
			role2.setRole_level("2");
			role2.setRole_name("管理员");
			
			user.getSetRole().add(role2);
			user.getSetRole().add(role);
			session.save(user);
			

			tr.commit();

		} catch (Exception e) {
			// TODO: handle exception
			tr.rollback();
		} finally {

		}

	}

}

数据库效果图

image.png

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Post Navigation