Hibernate學習筆記

摘要

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框架都大量使用的反射機制,反射可以在運行時獲取當前對象對應的類型,從而自動調用相關的方法,而不需要開發人員再寫大量重複代碼了,因此,開發效率得到極大提高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章