- 添加jpa annotation支持
- Annotation?还是XML映射文件
添加jpa annotation支持:
从JDK1.5之后,Java增加了Annotation的支持。Hibernate使用的Annotation是jpa制定的规范,不论是对Hibernate还是对jpa以及其他的ORM框架都适用,这是使用Annotation的好处之一。JPA规范推荐使用Annotation来管理实体类和数据表之间的映射关系,这样可以避免了一个实体需要同时维护两份文件(Java类和XML映射文件),实体类的Java代码已经映射信息都集中在一份文件中。
PO=POJO+@Annotation
实例如下:
持久化类Person:使用@Entity表示持久化类,@EmbeddedId表示标识主键,@Embedded用来映射属性为组件类型的。
package org.crazyit.app.domain;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name="person_table")
public class Person {
@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",length=20)
private String email;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="name" ,column=@Column(name="cat_name" ,length=20)),
@AttributeOverride(name="color" ,column=@Column(name="cat_color"))
})
private Cat cat;
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
}
标识组件类中加上@Enbeddable,且实现Serializable接口和重写equals和hashCode方法
@Embeddable
public class Name implements Serializable{
private String first;
private String last;
public Name(String string, String string2) {
this.first=string;
this.last = string2;
}
public Name() {
}
public String getFirst() {
return first;
}
public void setFirst(String first) {
this.first = first;
}
public String getLast() {
return last;
}
public void setLast(String last) {
this.last = last;
}
//重写equals方法,根据first、last进行判断
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj != null
&& obj.getClass() == Name.class)
{
Name target = (Name)obj;
if (target.getFirst().equals(getFirst())
&& target.getLast().equals(getLast()))
{
return true;
}
}
return false;
}
//重写hashCode方法,根据first、last计算hashCode值
public int hashCode()
{
return getFirst().hashCode() * 13
+ getLast().hashCode();
}
}
普通组件类中加上@Enbeddable
@Embeddable
public class Cat {
private String name;
private String color;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Cat(String name, String color) {
this.name = name;
this.color = color;
}
public Cat() {
}
}
在配置文件中添加<mapping class="" />
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">phpwind.net</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">true</property>
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">false</property>
<property name="hbm2ddl.auto">update</property>
<property name="use_sql_comments">true</property>
<!--
<mapping resource="org/crazyit/app/domain/Person.hbm.xml"/>
-->
<mapping class="org.crazyit.app.domain.Person"/>
</session-factory>
测试类:
public class PersonManager {
public static void main(String[] args) {
Session sess = MyHibernateUtil.currSession();
Transaction tx = sess.beginTransaction();
Person rmd = new Person();
Name name = new Name();
name.setFirst("first1");
name.setLast("last2");
rmd.setName(name);
Cat cat = new Cat("bluecat","blue");
rmd.setCat(cat);
rmd.setEmail("1031568262@qq.com");
sess.save(rmd);
tx.commit();
MyHibernateUtil.closeSession();
}
}
运行结果如下:
INFO: HHH000232: Schema update complete
Hibernate: /* insert org.crazyit.app.domain.Person */ insert into person_table (cat_color, cat_name, person_email, person_first, person_last) values (?, ?, ?, ?, ?)
如图所示:表的主键为Name组件的first 和last属性
1、持久化类需要添加的@Annotation
@Entity用于标注该类是一个持久化类。
@EmbeddedId用于标注复合类型的标识属性。
@Embedded用于标注一个组件属性。
可选的Annotation
@Column(name="table_column" ,length=20)用于指定属性对应列名和长度。
@AttributeOverrides({
@AttributeOverride(name="name1", column=@Column(name="table_column1",length=20)),
@AttributeOverride(name="name2", column=@Column(name="table_column2",length=20)),
})
上面的@AttributeOverrides和@AttributeOverride用于指定标识属性类和组件属性类对应列的列名和长度。
2、组件类需要添加的@Annotation
@Embeddable用于标注标识属性类和组件属性类。
3、标识属性类需要实现java.io.Serizlizable接口和重写equals()和hashCode()方法。
在hibernate.cfg.xml文件中,在<session-factory../>元素下添加子元素<mapping class="x.x.ABC" />来添加映射类。
Annotation?还是XML映射文件:
实际开发中,早期的Hibernate使用者大都习惯使用*.hbm.xml文件来管理映射关系,因此*.hbm.xml文件在实际企业开发中占用比较重要的地位。
对于新项目,推荐使用Annotation,主要有如下两个理由:
使用Annotation更加简洁,开发者可以将实体类的Java代码和Annotation集中在一个文件中管理,因此更加简单。
基于Annotation的实体具有更好的保值性。因为这些Annotation并不属于Hibernate,而是属于JPA规范,因此这些实体类不仅对于Hibernate可用,对于JPA也是用的。如果迁移到其他ORM框架上,底层实体类无须做任何改变。