hibernate的一對多配置
阿新 • • 發佈:2018-08-22
rem 不一致 lds ont hash 基礎 mysql column jdbc
首先是“一”的
Customer.java
1 package com.xiaostudy.domain; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 /** 7 * 一對多中的“一”的bean 8 * 9 * @author xiaostudy 10 * 11 */ 12 public class Customer { 13 // id 14 private Integer id; 15 // 普通屬性 16 private String name; 17 // “多”的集合,一般選Set集合,因為Set的特點,裏面的元素不能重復18 private Set<Order> order = new HashSet<Order>(); 19 20 // 自動生成get、set方法 21 public Integer getId() { 22 return id; 23 } 24 25 public void setId(int id) { 26 this.id = id; 27 } 28 29 public String getName() { 30 return name; 31 } 3233 public void setName(String name) { 34 this.name = name; 35 } 36 37 public Set<Order> getOrder() { 38 return order; 39 } 40 41 public void setOrder(Set<Order> order) { 42 this.order = order; 43 } 44 }
接著就是“多”
Order.java
1 package com.xiaostudy.domain;2 3 /** 4 * 一對多中的“多”的bean 5 * 6 * @author xiaostudy 7 * 8 */ 9 public class Order { 10 // id 11 private Integer id; 12 // 普通屬性 13 private String name; 14 // 一對多中的“一” 15 private Customer customer; 16 17 // 自動生成get、set方法 18 public Integer getId() { 19 return id; 20 } 21 22 public void setId(Integer id) { 23 this.id = id; 24 } 25 26 public String getName() { 27 return name; 28 } 29 30 public void setName(String name) { 31 this.name = name; 32 } 33 34 public Customer getCustomer() { 35 return customer; 36 } 37 38 public void setCustomer(Customer customer) { 39 this.customer = customer; 40 } 41 42 }
接著就是這兩個bean對應的映射關系配置文件
Customer.hbm.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <!-- 引進包,如果沒有引進,下面用到的類要全路徑 --> 6 <hibernate-mapping package="com.xiaostudy.domain"> 7 <!-- name為bean的類名,table為數據庫的表名 --> 8 <class name="Customer" table="customer"> 9 <!-- name為bean中的屬性id,column為數據庫中的列名 --> 10 <id name="id" column="id"> 11 <!-- generator:主鍵生成策略 12 1.increment 數據庫自己生成主鍵. 先從數據庫中查詢最大的ID值,將ID值加1作為新的主鍵 13 2.identity 依賴於數據的主鍵自增功能 14 3.sequence 序列,依賴於數據中的序列功能(Oracle). 15 4.hilo(純了解,永遠用不到) : Hibernate自己實現序列的算法,自己生成主鍵. (hilo算法 ) 16 5.native 自動根據數據庫判斷,三選一. identity|sequence|hilo 17 6.uuid 生成32位的不重復隨機字符串當做主鍵 18 7.assigned 自己指定主鍵值. 表的主鍵是自然主鍵時使用. 19 --> 20 <generator class="native"></generator> 21 </id> 22 <!-- property普遍屬性,name為bean中的普通屬性,column為數據庫中的列名,type為數據類型 --> 23 <property name="name" column="name" type="string"></property> 24 <!-- set為一對多中“一”的設置,inverse的值表示是否為自身維護關系,默認也是false --> 25 <set name="order" inverse="true"> 26 <!-- key為“一”對應“多”的鍵,column為鍵的名稱 --> 27 <key column="cid"></key> 28 <!-- one-to-many表明自身是一對多的“一”,class為“多”的類名 --> 29 <one-to-many class="Order" /> 30 </set> 31 </class> 32 </hibernate-mapping>
Order.hbm.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 6 <hibernate-mapping package="com.xiaostudy.domain"> 7 <!-- name為一對多中的“多”的類名,table為數據庫的表名, 8 註意:這裏不能用order做表名,因為在mysql中,它是一個關鍵詞 --> 9 <class name="Order" table="t_order"> 10 <!-- name是id的名稱,column為數據庫中表的列名 --> 11 <id name="id" column="id"> 12 <!-- generator:主鍵生成策略 13 1.increment 數據庫自己生成主鍵. 先從數據庫中查詢最大的ID值,將ID值加1作為新的主鍵 14 2.identity 依賴於數據的主鍵自增功能 15 3.sequence 序列,依賴於數據中的序列功能(Oracle). 16 4.hilo(純了解,永遠用不到) : Hibernate自己實現序列的算法,自己生成主鍵. (hilo算法 ) 17 5.native 自動根據數據庫判斷,三選一. identity|sequence|hilo 18 6.uuid 生成32位的不重復隨機字符串當做主鍵 19 7.assigned 自己指定主鍵值. 表的主鍵是自然主鍵時使用. 20 --> 21 <generator class="native"></generator> 22 </id> 23 <!-- property普遍屬性,name為bean中的普通屬性,column為數據庫中的列名,type為數據類型 --> 24 <property name="name" column="name" type="string"></property> 25 <!-- many-to-one表明自身為“多”,name為bean中屬性“一”的名稱,column為自身的外鍵id,class為“一”的類名 --> 26 <many-to-one name="customer" column="cid" class="Customer"></many-to-one> 27 </class> 28 </hibernate-mapping>
hibernate.cfg.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 6 <hibernate-configuration> 7 <session-factory> 8 <!-- 註冊驅動 --> 9 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 10 <!-- mysql的用戶名 --> 11 <property name="connection.username">root</property> 12 <!-- mysql的用戶密碼 --> 13 <property name="connection.password">123456</property> 14 <!-- 連接mysql的某庫 --> 15 <property name="connection.url">jdbc:mysql://localhost:3306/user</property> 16 <!-- 控制臺輸出sql --> 17 <property name="show_sql">true</property> 18 <!-- 格式化輸出的sql --> 19 <property name="format_sql">true</property> 20 <!-- 自動提交事務 --> 21 <!-- <property name="connection.autocommit">true</property> --> 22 <!-- 創建sql表 23 update:如果沒有表,則創建一個。如果有表,而且表結構一致,那麽不改變表。如果表結構不一樣,會添加sql表缺少的列,多余的也不會刪除。 24 create:不管sql表有沒有存在,都會重新創建表。 25 create-drop:在create的基礎上,每次關閉虛擬機時都會把表刪除了。 26 validate:效驗sql表,如果一致,則沒有反應,如果不一致了,會拋出異常。 27 --> 28 <property name="hbm2ddl.auto">update</property> 29 <!-- 將Session與線程綁定=> 只有配置了該配置,才能使用getCurrentSession --> 30 <property name="current_session_context_class">thread</property> 31 <!-- 數據庫方言配置 --> 32 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 33 <!-- 導入映射文件 --> 34 <mapping resource="com/xiaostudy/domain/Customer.hbm.xml"/> 35 <mapping resource="com/xiaostudy/domain/Order.hbm.xml"/> 36 </session-factory> 37 </hibernate-configuration>
HibernateUtils.java
1 package com.xiaostudy.util; 2 3 import org.hibernate.SessionFactory; 4 import org.hibernate.cfg.Configuration; 5 import org.hibernate.classic.Session; 6 7 /** 8 * Hibernate的工具類 9 * 10 * @author xiaostudy 11 * 12 */ 13 public class HibernateUtils { 14 // 定義一個SessionFactory 15 private static SessionFactory sessionFactory; 16 17 // 靜態代碼塊,當類加載時,會只執行一次 18 static { 19 // 加載配置文件,這裏沒有參數,是因為hibernate.cfg.xml文件是默認放在src目錄下 20 Configuration conf = new Configuration().configure(); 21 // 通過配置文件獲取一個SessionFactory 22 sessionFactory = conf.buildSessionFactory(); 23 // 當退出java虛擬機時,自動關閉資源 24 Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 25 @Override 26 public void run() { 27 sessionFactory.close(); 28 } 29 })); 30 } 31 32 // 每次都獲取新的一個Session 33 public static Session openSession() { 34 return sessionFactory.openSession(); 35 } 36 37 // 獲取當前線程的Session,多用於處理事務 38 public static Session getCurrentSession() { 39 return sessionFactory.getCurrentSession(); 40 } 41 42 }
Test1.java
1 package com.xiaostudy.test; 2 3 import org.hibernate.classic.Session; 4 5 import com.xiaostudy.domain.Customer; 6 import com.xiaostudy.domain.Order; 7 import com.xiaostudy.util.HibernateUtils; 8 9 /** 10 * 測試一對多 11 * 12 * @author xiaostudy 13 * 14 */ 15 public class Test1 { 16 17 public static void main(String[] args) { 18 // 根據工具類獲取一個全新的Session 19 Session session = HibernateUtils.openSession(); 20 // 開始事務 21 session.beginTransaction(); 22 // 創建“一”的對象 23 Customer customer = new Customer(); 24 // 賦值 25 customer.setName("demo1"); 26 // 創建“多”的對象 27 Order order1 = new Order(); 28 Order order2 = new Order(); 29 // 賦值 30 order1.setName("test1"); 31 order2.setName("test2"); 32 // 這裏是“一”沒有維護關系,所以在“多”的設置把“一”添加進來 33 order1.setCustomer(customer); 34 order2.setCustomer(customer); 35 // 數據持久化 36 session.save(customer); 37 session.save(order1); 38 session.save(order2); 39 // 關閉事務和提交數據 40 session.getTransaction().commit(); 41 // 關閉資源 42 session.close(); 43 } 44 45 }
整個項目上傳到碼雲:https://gitee.com/xiaostudy2/hibernate_one_to_many_demo/attach_files
hibernate的一對多配置