1. 程式人生 > >關於hibernate中@Transient註解使用的一點心得

關於hibernate中@Transient註解使用的一點心得

   (例): @Transient表示該屬性並非一個到資料庫表的欄位的對映,ORM框架將忽略該屬性. 
如果一個屬性並非資料庫表的欄位對映,就務必將其標示為@Transient,否則,ORM框架預設其註解為@Basic
    示例:
    //根據birth計算出age屬性

@Table(name="person")
public class Person{
	
    private Date birth;

    @Column(name = "birth")
    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }
     
    @Transient
    public int getAge(){
    	return getYear(new Date())-getYear(getBirth());    //getYear為類中的自定義方法,返回傳入日期的年份
    }
}

上面的這個轉載對@Transient的作用說的不是很清晰。

         說一點個人的心得,比如上面例子在一個持久化類person中定義了birth的屬性並且用了@Column註解在資料表中進行了對映,而getAge()方法註解為@Transient,表明在資料庫表中並沒有age這個對映欄位。

         當你通過欄位對映從資料庫獲取資料時,因為getAge()加了@Transient,並且在資料庫中沒有欄位。所以getAge()沒有從資料庫中獲取資料,而是通過getBirth()方法獲取資料庫中返回的birth,並通過計算返回getAge()的值。 

return getYear(new Date())-getYear(getBirth());

當你在程式中獲取到持久化類person的物件時,person.getAge()和person.getBirth()都有資料返回提供給你使用。

         這樣做的話,能減少資料庫的欄位,比如這個例子中就不需要新建一個關於age的資料庫欄位了,通過birth欄位和計算就能獲取到person的age屬性。@Transient還可以在持久化類中直接獲取關聯表中的欄位值,許多業務邏輯中都有很大的作用。

個人理解,如有不足之處,望指正。