hibernate中的Annotation补充
下面使用Annotation來定義一個實體類:
@Entity
@Table(name="person_table") ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //不是引入org.hibernate.persistence,因為這個只可以在hibernate環境下使用
public?class?Person ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//應引用javax.persistence,其實Annotation最后是放在get方法上面,更不容易出問題
{
?
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="first"
,?column=@Column(name="person_first")),
@AttributeOverride(name="last"
,?column=@Column(name="person_last"?,?length=20))
})
private?Name?name;
//普通屬性
@Column(name="person_email")
private?String?email;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="name"?
,?column=@Column(name="cat_name"?,?length=35)),
@AttributeOverride(name="color"?
,?column=@Column(name="cat_color"))
})
//組件屬性,代表此人擁有的寵物
private?Cat?pet;
//省略name屬性的setter和getter方法
...
//省略email屬性的setter和getter方法
...
//省略pet屬性的setter和getter方法
...
}
上面程序的粗體字代碼就可管理實體類與數據表之間的映射關系,其中@Entity用于標注該類是一個持久化類,@?EmbeddedId用于標注復合類型的標識屬性,而@Embedded用于標注一個組件屬性,也就是說Person的name屬性就是一個復合類型的標識屬性;pet屬性是一個組件屬性。
?
上面程序還用了Name類,它是一個Person實體的標識屬性的類型,程序使用@Embeddable標注它即可。如下代碼所示:
//修飾組件屬性類
@Embeddable
public?class?Name
implements?java.io.Serializable
{
private?String?first;
private?String?last;
//無參數的構造器
public?Name()
{
}
//初始化全部屬性的構造器
public?Name(String?first?,?String?last)
{
this.first?=?first;
this.last?=?last;
}
//省略first屬性的setter和getter方法
...
//省略last屬性的setter和getter方法
...
//提供重寫的equals方法
public?boolean?equals(Object?obj)
{
if?(this?==?obj)
{
return?true;
}
if?(obj.getClass()?==?Name.class)
{
Name?target?=?(Name)obj;
if?(target.getFirst().equals(first)
&&?target.getLast().equals(last))
{
return?true;
}
}
return?false;
}
//提供重寫的hashCode方法
public?int?hashCode()
{
return?first.hashCode()?+?last.hashCode()?*?17;
}
}
上面Name類需要作為標識屬性的類型,因此一樣需要實現java.io.Serializable接口,并重寫了hashCode()和equals()兩個方法。
?
至于Person類所包含的組件屬性pet,它所屬的Cat類也只要簡單地使用@Embeddable修飾即可,下面是該Cat類的代碼:
//修飾組件屬性類
@Embeddable
public?class?Cat
{
private?String?name;
private?String?color;
//無參數的構造器
public?Cat()
{
}
//初始化全部屬性的構造器
public?Cat(String?name?,?String?color)
{
this.name?=?name;
this.color?=?color;
}
//省略name屬性的setter和getter方法
...
//省略color屬性的setter和getter方法
...
}
?
一旦在實體類中通過上面Annotation進行標注之后,Hibernate已經能夠理解實體類與數據表之間的映射關系了,也就不再需要*.hbm.xml的映射文件了。此時要將hibernate.cfg.xml文件略做修改——告訴它去加載指定實體類,而不是根據映射文件加載。本應用所使用的hibernate.cfg.xml文件代碼如下:
<?xml?version="1.0"?encoding="GBK"?>
<!--?指定Hibernate配置文件的DTD信息?-->
<!DOCTYPE?hibernate-configuration?PUBLIC
"-//Hibernate/Hibernate?Configuration?DTD?3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!--?hibernate-?configuration是連接配置文件的根元素?-->
<hibernate-configuration>
<session-factory>
<!--?省略其他配置屬性?-->
...
<!--?羅列所有的持久化類?-->
<mapping?class="org.crazyit.app.domain.Person"/>
</session-factory>
</hibernate-configuration>
經過上面修改之后,主程序不需要任何改變。不管使用XML映射文件管理實體的映射、還是采用Annotation管理實體的映射,Hibernate的處理完全相同。
轉載于:https://www.cnblogs.com/java20130725/archive/2012/04/08/3215775.html
總結
以上是生活随笔為你收集整理的hibernate中的Annotation补充的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: winform程序怎么更改图标
- 下一篇: 第三章--网络基本拓扑性质(复杂网络学习