構造這樣一個例子,在測試過程中來說明一些Hibernate的進階配置及其相關機制:
有三個類:Category.java,Prodcuct.java,ConfigurationTest.java,其中第三個類是用來測試的。
Category.java代碼:
- package unsaved_value;
- import ......
- public class Category {
- private Integer id;
- private String name;
- private String description;
- private Set products;
- public Category(){
- id=null;
- name=null;
- description=null;
- products=new HashSet();
- }
- public void addProduct(Product p){
- products.add(p);
- }
- //**********setter and getter
- ........
- }
Product.java代碼:
- package unsaved_value;
- public class Product {
- private Integer id;
- private String name;
- private Category category;
- private String description;
- public Product(){
-
- }
- //*******getter and setter
- .........
- }
ConfigurationTest.java
- public void testSave()throws Exception{
- Category category=new Category();
- category.setName("java編程書籍2");
- category.setDescription("編程經典書籍2");
- Product pro=new Product();
- pro.setName("java編程思想2");
- pro.setDescription("第四版中文版2");
- pro.setCategory(category);
- category.addProduct(pro);
- Transaction tx=session.beginTransaction();
- assert (session!=null):("session is null");
- session.save(category);
- tx.commit();
- }
Category代表產品目錄,而Product代表產品,顯然Category與Product是一對多的關係。Hibernate在映射一對多關聯性時,有兩種方式,一種是單向一對多,一種是雙向關係。兩者相比,雙向一對多的好處體現在兩方面: 首先,也是很明顯的一點,由於是雙向關聯,我們在實際商務邏輯時將更方便,例如我們可以檢索一個Category下的所有Product,同時還可以檢索出Product屬於哪個。 其次,雙向關係相對單向關係而言,在資料庫的訪問方面更有優勢。這一點留在後面講inverse時講
。雙向關聯比單向關聯唯一的”劣勢“,就在於雙向關聯需要比單向關聯多寫一個對應檔,這不問題。使用雙向關聯實現這兩個類同資料庫的映射:
- Category.hbm.xml:
- version="1.0" encoding="UTF-8"?>
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
- <hibernate-mapping package="unsaved_value">
- <class name="Category" table="category">
- <id name="id" column="id">
- <generator class="native">