摘要
Hibernate是JavaEE中非常流行的框架,目的是完成Java實體類到數據庫中表之間的映射。它最開始只關注Java與關係型數據庫中的關係,由於非關係型數據庫的逐漸流行,因此它也延伸到對非關係型數據庫的映射。Hibernate將JDBC進行了進一步封裝,使開發人員不必寫任何與數據庫相關的sql語句,只需要寫Java代碼和配置文件就可以完成持久化操作。配置文件可以由Java註解代替,因此可以完全由Java代碼就可以完成實體類到表(或者其他類型)的映射。
1 Hibernate的配置文件hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- An database configuration -->
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.password">lwb12345</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/hibernatedb</property>
<property name="hibernate.connection.username">postgres</property>
<property name="hibernate.connection.pool_size">2</property>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQL94Dialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- An object to table -->
<mapping class="org.weebing.dto.UserDetails"/>
</session-factory>
</hibernate-configuration>
<property name=“hibernate.hbm2ddl.auto”>create</ property> 寫上就不需要在數據庫手動建表,hibernate自動幫助我們建表。
2 實例
2.1 實體類
實體類將被Hibernate自動映射爲數據庫中的表
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Person {
@Id
private int id;
private String name;
private int age;
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
@Entity
註解表示實體類,對應於數據庫中的表結構。@Id
註解對應於數據庫中表的主鍵。
2.2 持久化操作
下面代碼將person對象存儲在了數據庫中。
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.weebing.domain.Person;
public class PersonRepository {
public static void main(String[] args) {
// 實體類創建
Person person = new Person();
person.setId(101);
person.setName("weebing");
person.setAge(18);
// 添加實體類到數據庫
Configuration conf = new Configuration().configure().addAnnotatedClass(Person.class);
SessionFactory sessionFactory = conf.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
session.save(person);
transaction.commit();
}
}
示例代碼僅包含部分關鍵的註解,其他註解請查看官方文檔。
2.3 實體類與表的映射關係
實體類 | 表 |
---|---|
類實例 | 一條記錄 |
成員變量 | 屬性 |
標註爲@Id的成員變量 | 主鍵 |
2.4 會話與事務之間的關係
會話(session)表示實體類與數據庫的一次連接,它們之間連接中斷,則會話中斷。事務(Transaction)表示會話連接中的一次邏輯操作單元。事務具有四個重要特性:原子性、一致性、隔離性和持久性。他的兩個關鍵操作是“提交”和“回滾”。由定義可知,一個會話可以包含多個事務,一個具體事務僅包含在唯一存在的會話中。
2.5 淺析Hibernate底層實現原理
包括Hibernate在內的JavaEE框架都大量使用的反射機制,反射可以在運行時獲取當前對象對應的類型,從而自動調用相關的方法,而不需要開發人員再寫大量重複代碼了,因此,開發效率得到極大提高。