现在的位置: 首页 > 综合 > 正文

Hibernate读书笔记之关联关系

2017年11月09日 ⁄ 综合 ⁄ 共 5691字 ⁄ 字号 评论关闭

1.今天做一下Hibernate中实体类之间关联关系的笔记2.

2.首先说一下onetomany和manytoone,首先需要建立2个实体类,就拿员工和部门举例子吧,一个部门对应多个员工,一个员工只属于一个部门。

package com.icss.hibernate.map;

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

public class Department {
	
	private Integer id;
	private String name;
	private Set<Employee> employees=new HashSet<Employee>();
	
	
	@Override
	public String toString() {
		return "Department [id=" + id + ", name=" + name + ", employees="
				+ employees + "]";
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<Employee> getEmployees() {
		return employees;
	}
	public void setEmployees(Set<Employee> employees) {
		this.employees = employees;
	}
	
	

}

Employee类

package com.icss.hibernate.map;

public class Employee {
	
	
	private Integer id;
	private String name;
	private Department department;
	
	@Override
	public String toString() {
		return "Employee [id=" + id + ", name=" + name + ", department="
				+ department + "]";
	}
	
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Department getDepartment() {
		return department;
	}
	public void setDepartment(Department department) {
		this.department = department;
	}
	
	

}

3.提供2个类对应的hbm文件,最重要的就是这个文件的配置了。

<?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 package="com.icss.hibernate.map">

    <class name="Department" table="DEPARTMENT">

        <id name="id" type="java.lang.Integer">
            <column name="DEPARTMENT_ID" />
            <generator class="native" />
        </id>
        
        <property name="name" type="java.lang.String">
            <column name="DEPARTMENT_NAME" />
        </property>
        
         <set name="employees" inverse="true">
            <key column="departmentId"></key>
            <one-to-many class="Employee"/>
         </set>
		<!-- 
			映射多对一的关联关系。 使用 many-to-one 来映射多对一的关联关系 
			name: 多这一端关联的一那一端的属性的名字
			class: 一那一端的属性对应的类名
			column: 一那一端在多的一端对应的数据表中的外键的名字
		-->
		

    </class>
</hibernate-mapping>

Employee.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 package="com.icss.hibernate.map">

    <class name="Employee" table="EMPLYOEE">

        <id name="id" type="java.lang.Integer">
            <column name="EMPLYOEE_ID" />
            <generator class="native" />
        </id>
        
        <property name="name" type="java.lang.String">
            <column name="USER_NAME" />
        </property>
        
        <many-to-one name="department" class="Department" column="departmentId"></many-to-one>
		<!-- 
			映射多对一的关联关系。 使用 many-to-one 来映射多对一的关联关系 
			name: 多这一端关联的一那一端的属性的名字
			class: 一那一端的属性对应的类名
			column: 一那一端在多的一端对应的数据表中的外键的名字
		-->
		

    </class>
</hibernate-mapping>

具体的里面的属性说明如图:

4.编写Hibernate.cfg,xml文件

<!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.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="connection.url">jdbc:mysql:///321</property>
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="connection.username">root</property>
		<property name="hibernate.connection.password">123</property>

		<!-- 其他配置 -->
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		<!-- 
			create:先删除,再创建
			update:如果表不存在就创建,不一样就更新,一样就什么都不做。
			create-drop:初始化时创建表,SessionFactory执行close()时删除表。
			validate:验证表结构是否一致,如果不一致,就抛异常。
		 -->
		<property name="hbm2ddl.auto">update</property>
	
	
		
		<mapping resource="com/icss/hibernate/map/Department.hbm.xml"/>
		<mapping resource="com/icss/hibernate/map/Employee.hbm.xml"/>
		
	
	
	</session-factory>
</hibernate-configuration>

5编写测试代码

package com.icss.hibernate.map;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Before;
import org.junit.Test;

public class HibernateTest {
	
	private SessionFactory sessionFactory;
	private Session session;
	private Transaction transaction;
	
	@Before
	public void init(){
		
		Configuration configuration=new Configuration().configure();
		sessionFactory =configuration.buildSessionFactory();
		session=sessionFactory.openSession();
		transaction=session.beginTransaction();
		
	}

	@Test
	public void testSave() {
//		创建对象
		Department department=new Department();
		department.setName("研发部");
		Department department2=new Department();
		department2.setName("财务部");
		
		
		
		Employee employee=new Employee();
		employee.setName("张三");
		Employee employee2=new Employee();
		employee2.setName("李四111111");
//关联关系		
		employee.setDepartment(department);
		employee2.setDepartment(department2);
		
//		department.getEmployees().add(employee);
//		department2.getEmployees().add(employee2);
//执行保存	
		session.save(department);
		session.save(department2);
		session.save(employee);
		session.save(employee2);
		
		
		session.getTransaction().commit();
		session.close();
		
	}
	
	@Test
	public void getUser(){
		
		
		 session = sessionFactory.openSession();
		session.beginTransaction();
		
		Department department=(Department) session.get(Department.class, 1);
		System.out.println(department);
		System.out.println(department.getEmployees());
		
		
		
		session.getTransaction().commit();
		session.close();
		
		
		
	}
	
	

}

note:

Hibernate3.6
持久层的框架

添加环境:
1,jar包
2,配置文件
hibernate.cfg.xml
xxx.hbm.xml

使用Hibernate实现CRUD操作
// --- 准备
Configuration cfg = new Configuration().configure(); // hibernate.cfg.xml
SessionFactory sessionFactory = cfg.buildSessionFactory(); // 只需要一个

// --- 模板代码
Session session = sessionFactory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
// 操作
tx.commit();
}catch(Exception e){
tx.rollback();
throw e;
}finally{
session.close();
}

// --- 操作
Session中的方法:
save(Object)
--> insert into ..
update(Object)--> update ..
saveOrUpdate(Object)
delete(Object)--> delete ..
get(Class, id)--> select ...
createQuery(hql)--> select ..

主配置文件
1,数据库信息
方言、URL、驱动、用户名、密码
2,导入映射文件
3,其他配置
show_sql = true
hbm2ddl.auto = update

映射配置:
映射基础
类 -- 表
属性 -- 列
映射普通属性
name, type, column, length, not-null, ...
映射主键
主键生成略:native, uuid

抱歉!评论已关闭.