程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 對象-關系映射基礎,對象映射基礎

對象-關系映射基礎,對象映射基礎

編輯:JAVA綜合教程

對象-關系映射基礎,對象映射基礎


持久化類的屬性及訪問方法

Hibernate中持久化類的訪問者有兩個:

1.Java應用程序

2.hibernate(何時調用get、set方法?)

Java應用程序不能訪問持久化類的private方法,而hibernate沒有這個限制,它可以訪問各種級別的方法。

基本數據類型和包裝類型

基本數據類型和包裝類型對應的hibernate映射類型相同.

<property name=“price” type=“double” column=“PRICE” />

基本類型可直接運算、無法表達null、數字類型的默認值為0。

包裝類默認值是null。當對於默認值有業務意義的時候需要使用包裝類。

Hibernate訪問持久化類屬性的策略

1.property默認值:表明hibernate通過getXXX和setXXX來訪問類屬性。推薦使用。提高域模型透明性。

2.field:hibernate通過java反射機制直接訪問類屬性。對於沒有javabean方法的屬性可設置該訪問策略。

<property name=“name” access=“field” />

除了設置property屬性的access為field和property之外還可以自定義訪問策略,需要創建實現net.sf.hibernate.property.PropertyAccessor接口的類.然後把類的完整名字

賦值給<property>元素的access屬性

在持久化類的方法中加入程序邏輯

class Customer{
     …..
     private String firstname ;
     private String lastname ;
     public String getName(){
           return firstname + “ ” + lastname ;
     }
     public void setName(String name){
            StringTokenizer t = new StringTokenizer(name);
            firstname = t.nextToken();
            lastname = t.nextToken();
     }
} 

在customer.hbm.xml文件中無需映射firstname和lastname屬性,而是映射name屬性。

<property name =“name” column=“NAME” />

盡管類中並沒有name屬性,由於hibernate不是直接訪問Name屬性,而是調用get、set方法,因此建立了Firstname、Lastname和表之間的聯系。

不管在類中是否存在name屬性,只要在Customer.hbm.xml文件中映射了name屬性,在hql語句中就能訪問他。

Session.find(“from customer as c where c.name=‘tom’”)

在customer類的setOrders()方法中加入程序邏輯。

public void setOrders(Set orders){
    this.orders = orders ;
    calprice();
}

Public calprice(){
    ……
    setAvgPrice(avgprice);
}

在setSex()方法中加入數據驗證邏輯

public void setSex(char sex){
    if(sex != ‘M’ && sex != ‘F’){
          throw new IllegalArgumentException(“Invalid sex”);
    }
    this.sex = sex;
}

設置派生屬性

  利用<property>元素的formula屬性,用來設置一個sql表達式,hibernate將根據它來計算出派生屬性的值。

<property name=“totalprice” 
formula=“(select sum(o.PRICE) from ORDERS o where o.CUSTOMER_ID=ID)” />
<property name=“unitprice” formula=“BASE_PRICE*QUANTITY” />

另一種方案:在映射文件中不映射屬性,在set方法中加入程序邏輯。

控制insert、update語句

映射屬性

作用

<property>

 insert屬性

若為false,在insert語句中不包含該字段,該字段永遠不能被插入。默認值true。

<property>

 update屬性

若為false,update語句不包含該字段,該字段永遠不能被更新。默認值為true。

<class>

mutable屬性

若為false,等價於所有的<property>元素的update屬性為false,整個實例不能被更新。默認為true。

<property>

dynamic-insert屬性

若為true,保存一個對象時,會生成動態insert語句,只有這個字段取值不為null才會把它包含到insert語句中。默認為false。

<property>

dynamic-update屬性

若為true,更新一個對象時,會生成動態update語句,只有這個字段取值不為null才會把它包含到update語句中。默認為false。

<class>

dynamic-insert屬性

若為true,等價於所有的<property>元素的dynamic-insert為true,保存一個對象時,動態生成insert語句,語句中僅包含取值不為null的字段。默認false。

<class>

dynamic-update屬性

若為true,等價於所有的<property>元素的dynamic-update為true,更新一個對象時,動態生成update語句,語句中僅包含取值不為null的字段。默認false。

處理sql引用標識符    在SQL語法中,標識符是指用於為數據庫表、視圖、字段或索引等命名的字符串,常規標識符不包括空格,也不包含特殊字符,因此無需使用引用符號。如果數據庫表名或列名包含特殊字符,可以使用引用標識符。

<property name=“description” column=“`CUSTOMER DESCRIPTION`” />

設置類的包名 如果在一個映射文件中包含多個類,並且這些類位於同一個包中,可以設置<hibernate-mapping>元素的package屬性,避免為每個類提供完整的類名。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved