Hibernate维护一对多对应关系

    比如学校和学生,一个学校可以有多个学生,一个学生只能属于一个学校。这就属于一对多关系

image.png

      第一步创建两个实体类,用户类和学校类

      学生类

package com.netxintai.domain;

public class User {

	private Integer u_id;

	private String username;

	private String password;

	private String sex;

	private String address;
	
	/*
	 * 一个学生只有一个学校 指向为目的
	 * 
	 * */
	
	private School school;

	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 getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getAddress() {
		return address;
	}

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

	public School getSchool() {
		return school;
	}

	public void setSchool(School school) {
		this.school = school;
	}


}

      学校类

package com.netxintai.domain;

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

public class School {
	
	private Integer s_id;
	
	private String sname;
	/*
	 * 一个学校可以有多个学生,hibernate规定为Set集合封装多个数据
	 * 
	 * */
	private Set<User> setUser=new HashSet<User>();

	public Integer getS_id() {
		return s_id;
	}

	public void setS_id(Integer s_id) {
		this.s_id = s_id;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public Set<User> getSetUser() {
		return setUser;
	}

	public void setSetUser(Set<User> setUser) {
		this.setUser = setUser;
	}
	
	
	

}

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

        学生类映射配置文件

<?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.domain.User" table="t_user">
		<id name="u_id" column="u_id">
			<generator class="native"></generator>
		</id>
		<property name="username" column="username" />
		<property name="password" column="password" />
		<property name="sex" column="sex" />
		<property name="address" column="address" />
		<!-- 表示学生所属学校
			name属性:学生类对应的学校名称School类 写school
			class属性 School类的全路径
			column属性: 外键名称 
		 -->
		<many-to-one name="school" class="com.netxintai.domain.School"
			column="suid"></many-to-one>

	</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.domain.School" table="s_school">
		<id name="s_id" column="s_id">
			<generator class="native"></generator>
		</id>
		<property name="sname" column="sname"/>

		<!-- 学校映射文件中,表示所有联系人 
		使用Set标签表示所有联系人set标签里面有name属性,属性值写在学校实体类里面表示联系人的set集合名称
		 -->

		<set name="setUser" cascade="save-update" inverse="true">
	
		<!-- 一对多建表,有外键
			hibernate机制,双向维护未安检,在一核多那一方都要配置外键,column属性值:外键名称
		 -->
		<key column="suid"></key>
			<!-- 一对多配置class里面写学生实体类的全路径 -->
		<one-to-many class="com.netxintai.domain.User"></one-to-many>
	</set>
	
		
	</class>



</hibernate-mapping>

    在hibernate文件中引入两个配置文件

<?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/domain/School.hbm.xml"/>
	<mapping resource="com/netxintai/domain/User.hbm.xml"/>

	</session-factory>


</hibernate-configuration>

   测试代码

package com.netxintai.dome;

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

import com.netxintai.domain.School;
import com.netxintai.domain.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();
			School school = new School();

			user.setAddress("长安");
			user.setPassword("147");
			user.setUsername("李世民");

			school.setSname("长安大学");

			user.setSchool(school);
			school.getSetUser().add(user);

			session.save(school);

			tr.commit();

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

		}

	}

}

          测试结果

image.png

  备注:不懂Hibernateutils工具类的点击这里 hibernateUtils工具类

发表回复

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

Post Navigation