2014-10-17 72 views
0

我是新來冬眠我寫我的第一個休眠代碼,我無法理解的輸出與它的代碼是:的Hibernate代碼Understandig輸出

持久類:

package com.andoi.hibernate; 

public class Customers { 
    public int cid; //Primary key 
    public String cname; 
    public String email; 
    public long phone; 


    public Customers(){ 
     System.out.println("Customers->dc"); 
    } 
    public Customers(String cname,String email,long phone){ 
     System.out.println("Customers->three arg"); 
     this.cname=cname; 
     this.email=email; 
     this.phone=phone; 
    } 
    public int getCid() { 
     System.out.println("getCid()"); 
     return cid; 
    } 
    public void setCid(int cid) { 
     System.out.println("setCid()"); 
     this.cid = cid; 
    } 
    public String getCname() { 
     System.out.println("getCname()"); 
     return cname; 
    } 
    public void setCname(String cname) { 
     System.out.println("setCname()"); 
     this.cname = cname; 
    } 
    public String getEmail() { 
     System.out.println("getEmail()"); 
     return email; 
    } 
    public void setEmail(String email) { 
     System.out.println("setEmail()"); 
     this.email = email; 
    } 
    public long getPhone() { 
     System.out.println("getPhone()"); 
     return phone; 
    } 
    public void setPhone(long phone) { 
     System.out.println("setPhone()"); 
     this.phone = phone; 
    } 
} 

Hibernate映射文件:

<hibernate-mapping package="com.andoi.hibernate"> 
<class name="Customers" table="jlccustomers"> 
<id name="cid" column="cid" type="int"> 
<generator class="increment"/> 
</id> 
<property name="cname" column="cname" type="string"/> 
<property name="email" column="email" type="string"/> 
<property name="phone" column="phone" type="long"/> 
</class> 

</hibernate-mapping> 

客戶端代碼:

package com.andoi.hibernate; 

import org.hibernate.cfg.*; 
import org.hibernate.*; 

public class SaveInTable { 

    public static void main(String[] args){ 
     Transaction tx=null; 

     try{ 
     Configuration cfg=new Configuration(); 
     cfg=cfg.configure(); 
     SessionFactory sf=cfg.buildSessionFactory(); 
     Session session=sf.openSession(); 
     tx=session.beginTransaction(); 
}catch(HibernateException e){ 
      if(tx!=null) 
       tx.rollback(); 
      e.printStackTrace(); 
     } 
    } 

} 

,並輸出爲:

Customers->dc 
getCid() 
Customers->dc 
getCname() 
getEmail() 
getPhone() 
setCname() 
setEmail() 
setPhone() 

我的問題是,爲什麼在創建我的執着類對象和getter和setter方法被調用。

回答

0

當您創建會話工廠時,休眠會加載配置文件 - hibernate.cfg.xml並解析其中的每一行。

現在您將在此配置文件中具有映射文件詳細信息,因此hibernate會解析每個映射文件(* .hbm.xml文件)並嘗試驗證映射信息是否正確。

因此,根據hbm文件中的映射信息,它檢查Java類是否存在並加載該類的一個實例,然後使用Java類中可用的字段驗證映射到hibernate映射文件中的每個屬性,以及確保每個領域都有適當的setter和getter方法可用。這就是您看到對Java類的默認構造函數和getter和setter方法的調用的原因。假設如果你在hbm文件中沒有映射的Java類中有一個字段,那麼hibernate將不會查找該字段及其對應的getter方法。