單向的一對多關聯關系(One to Many)
對象模型關系分析:
少的一端:會通過引用一個多端的集合對象,建立對象模型關系
多的一端:沒有任何變化,不知道和少的一端存在着關系。
關系模型分析:
少的一端:沒有任何變化
多的一端:會和少的一端建立外鍵關系
使用時需要少的一端所對應的XXX.hbm.xml中進行配置
<bag name="對多的一端對象集合的屬性名稱">
<!-- 用key元素指定關聯的外鍵列,會在多的一端所對應的表中産生 -->
<key column="account_id" />
<!-- 用one-to-many元素關聯到多端的實體類 -->
<one-to-many class="多的一端類的全限定名稱" />
</bag>
注意:
注意:
在有映射關系的實體類中,對于普通屬性會進行資料的立即加載,而對于非普通屬性預設采用的是延遲加載。
可以在XXX.hbm.xml關聯檔案中通過指定lazy="false" 采取立即加載方式。
對延遲加載的對象也可以使用Hibernate.initialize(Object proxy);方法進行強制初始化。
package model;
/**
* @author sally
* 單向的多對一
* 少的一端
*/
public class Dept {
private int id;
private String deptName;
public Dept(){
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
}
package model;
import java.util.Date;
/**
*
* @author sally
* Many to One
* 多的一端
*/
public class Employee {
private int id;
private String empName;
private Date hiredate;
//對一端的引用
private Dept dept;
public Employee(){
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name屬性指定類名(全限定名) table指明表名,不指明table資料預設的表名和實體名一緻 -->
<class name="model.Dept" table="dept_tab">
<!-- type指明目前字段的類型 name對應實體中的屬性名 -->
<id type="integer" name="id">
<!-- 提供ID自增的政策 native會根據資料庫自行判斷 -->
<generator class="native"/>
</id>
<property name="deptName" type="string"></property>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name屬性指定類名(全限定名) table指明表名,不指明table資料預設的表名和實體名一緻 -->
<class name="model.Employee" table="emp_tab">
<!-- type指明目前字段的類型 name對應實體中的屬性名 -->
<id type="integer" name="id">
<!-- 提供ID自增的政策 native會根據資料庫自行判斷 -->
<generator class="native"/>
</id>
<property name="empName" type="string"></property>
<property name="hiredate" type="timestamp"></property>
<!-- 用 many-to-one 元素映射多對一關聯
name屬性:指定關聯的屬性名
column屬性:指定此關聯屬性在資料庫表中的外鍵字段名 -->
<many-to-one name="dept" column="dept_id"></many-to-one>
</class>
</hibernate-mapping>
<!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.MySQL5InnoDBDialect</property>
<!-- 資料庫驅動 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///m2o</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.show_sql">true</property>
<!-- 其它屬性配置 -->
<!-- 指明C3P0的提供者 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!-- 連接配接池參數的配置 -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">30</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_statements">50</property>
<!-- 列印SQL語句到控制台 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 注冊實體的對象關系映射檔案 -->
<mapping resource="model/Dept.hbm.xml"/>
<mapping resource="model/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
package test;
import java.util.Date;
import model.Dept;
import model.Employee;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;
import util.HibernateUtils;
public class EmployeeTest {
@Test
public void createTable(){
Configuration cfg=new Configuration().configure();
SchemaExport se=new SchemaExport(cfg);
se.create(true, true);
}
@Test
public void save(){
Session session=HibernateUtils.getSession();
Transaction ts=session.beginTransaction();
//在單向的多對一中,要先添加少的一端
Dept dept=new Dept();
dept.setDeptName("财務部");
session.save(dept);
Employee emp=new Employee();
emp.setEmpName("zhangsan");
emp.setHiredate(new Date());
emp.setDept(dept);
session.save(emp);
ts.commit();
HibernateUtils.close(session);
}
@Test
public void get(){
Session session=HibernateUtils.getSession();
Transaction ts=session.beginTransaction();
Employee emp=(Employee)session.get(Employee.class, 1);
System.out.println(emp.getEmpName()+"---->"+emp.getHiredate());
Hibernate.initialize(emp.getDept());
//Dept dept=emp.getDept();
//System.out.println(dept.getId()+"-->"+dept.getDeptName());
ts.commit();
HibernateUtils.close(session);
}
}
package util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static SessionFactory factory;
static{
factory=new Configuration().configure().buildSessionFactory();
}
public static SessionFactory getFactory(){
return factory;
}
public static Session getSession(){
return factory.openSession();
}
public static void close(Session session){
if(session!=null){
session.close();
}
}
}
版權聲明:本文為CSDN部落客「weixin_34010566」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/weixin_34010566/article/details/92251117