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