下面使用Annotation来定义一个实体类:
@Entity
@Table(name="person_table") //不是引入org.hibernate.persistence,因为这个只可以在hibernate环境下使用
public
{
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="first"
,
@AttributeOverride(name="last"
,
})
private
//普通属性
@Column(name="person_email")
private
@Embedded
@AttributeOverrides({
@AttributeOverride(name="name"
,
@AttributeOverride(name="color"
,
})
//组件属性,代表此人拥有的宠物
private
//省略name属性的setter和getter方法
...
//省略email属性的setter和getter方法
...
//省略pet属性的setter和getter方法
...
}
上面程序的粗体字代码就可管理实体类与数据表之间的映射关系,其中@Entity用于标注该类是一个持久化类,@
上面程序还用了Name类,它是一个Person实体的标识属性的类型,程序使用@Embeddable标注它即可。如下代码所示:
//修饰组件属性类
@Embeddable
public
implements
{
private
private
//无参数的构造器
public
{
}
//初始化全部属性的构造器
public
{
this.first
this.last
}
//省略first属性的setter和getter方法
...
//省略last属性的setter和getter方法
...
//提供重写的equals方法
public
{
if
{
return
}
if
{
Name
if
&&
{
return
}
}
return
}
//提供重写的hashCode方法
public
{
return
}
}
上面Name类需要作为标识属性的类型,因此一样需要实现java.io.Serializable接口,并重写了hashCode()和equals()两个方法。
至于Person类所包含的组件属性pet,它所属的Cat类也只要简单地使用@Embeddable修饰即可,下面是该Cat类的代码:
//修饰组件属性类
@Embeddable
public
{
private
private
//无参数的构造器
public
{
}
//初始化全部属性的构造器
public
{
this.name
this.color
}
//省略name属性的setter和getter方法
...
//省略color属性的setter和getter方法
...
}
一旦在实体类中通过上面Annotation进行标注之后,Hibernate已经能够理解实体类与数据表之间的映射关系了,也就不再需要*.hbm.xml的映射文件了。此时要将hibernate.cfg.xml文件略做修改——告诉它去加载指定实体类,而不是根据映射文件加载。本应用所使用的hibernate.cfg.xml文件代码如下:
<?xml
<!--
<!DOCTYPE
"-//Hibernate/Hibernate
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!--
<hibernate-configuration>
<session-factory>
<!--
...
<!--
<mapping
</session-factory>
</hibernate-configuration>
经过上面修改之后,主程序不需要任何改变。不管使用XML映射文件管理实体的映射、还是采用Annotation管理实体的映射,Hibernate的处理完全相同。