1. 程式人生 > >hibernate的一對多配置

hibernate的一對多配置

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 } 32
33 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的一對多配置