展示從傳統 hbm.xml 遷移至 JPA Annotations 的完整對照範例。
三個類別:HibernateUtil、Person、Test(test.hibernate 套件)。
<hibernate-mapping>
<class name="test.hibernate.Person" table="person">
<id name="id" type="integer">
<column name="id" />
<generator class="native"/>
</id>
<property name="name" type="string"><column name="name"/></property>
<property name="sex" type="string"><column name="sex"/></property>
<property name="age" type="integer"><column name="age"/></property>
<bag name="list" cascade="all">
<key column="person"/>
<one-to-many class="test.hibernate.Person"/>
</bag>
</class>
</hibernate-mapping>
CREATE TABLE person (id INTEGER NOT NULL AUTO_INCREMENT, name VARCHAR(255), sex VARCHAR(255), age INTEGER, person INTEGER, PRIMARY KEY (id));
ALTER TABLE person ADD INDEX FKC4E39B5511C4A5C2 (person), ADD CONSTRAINT FKC4E39B5511C4A5C2 FOREIGN KEY (person) REFERENCES person (id);
僅需三個類別(test.hibernate.annotation 套件),不再需要 hbm.xml。加入 hibernate-annotations.jar、ejb3-persistence.jar 至 classpath。
sessionFactory = new AnnotationConfiguration()
.addPackage("test.hibernate.annotation")
.addAnnotatedClass(Person.class)
.configure()
.buildSessionFactory();
@Entity(access = AccessType.PROPERTY)
@Table
public class Person implements Serializable {
private Integer id;
private String name;
private String sex;
private Integer age;
private List list = new LinkedList();
@Id
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
@Basic
public String getName() { return name; }
public void setName(String name) { this.name = name; }
@Basic
public String getSex() { return sex; }
public void setSex(String sex) { this.sex = sex; }
@Basic
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
@Transient // 本例不示範集合映射
public List getList() { return list; }
public void setList(List list) { this.list = list; }
}
所有屬性使用預設值。Test.java 代碼不變。
mysql> DESCRIBE person;
+--------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| sex | varchar(255) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| person | int(11) | YES | MUL | NULL | |
+--------+--------------+------+-----+---------+----------------+
mysql> SELECT * FROM person;
+----+---------+------+------+--------+
| id | name | sex | age | person |
+----+---------+------+------+--------+
| 1 | icerain | male | 19 | NULL |
+----+---------+------+------+--------+
遷移到 Annotations 簡化配置,更重要是理解 EJB3 持久化機制、提升開發效率。歡迎回饋交流。