關於hibernate中@Transient註解使用的一點心得
阿新 • • 發佈:2019-01-03
(例): @Transient表示該屬性並非一個到資料庫表的欄位的對映,ORM框架將忽略該屬性.
如果一個屬性並非資料庫表的欄位對映,就務必將其標示為@Transient,否則,ORM框架預設其註解為@Basic
示例:
//根據birth計算出age屬性
如果一個屬性並非資料庫表的欄位對映,就務必將其標示為@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還可以在持久化類中直接獲取關聯表中的欄位值,許多業務邏輯中都有很大的作用。
個人理解,如有不足之處,望指正。