hibernate框架筆記總結

ORM(Object-Relation-Mapping)框架:對象關係映射框架
是對JDBC的輕量封裝
經過操做對象來操做數據庫
jar包java

required包
驅動包
日誌包,日誌配置文件(放到src下)
配置文件
映射配置文件sql

類名.hbm.xml
與實體類放到同一個包下
 數據庫

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.cyahua.domain.Customer" table="t_customer" catalog="hibernatetest">
        <id name="id" column="id" length="11">
            <generator class="native"></generator>
        </id>
        <property name="name" column="name" length="20"></property>
        <property name="address" column="address" length="50"></property>
    </class>
</hibernate-mapping>
統一聲明包名,這樣在<class>中就不須要寫類的全名.
關於<class>標籤配置
name屬性:類的全名稱
table 表的名稱,能夠省略,這時表的名稱就與類名一
catalog屬性:數據庫名稱 能夠省略.若是省略,參考核心配置文件中url路徑中的庫名稱
關於<id>標籤
首先它必須存在。<id>是用於創建類中的屬性與表中的主鍵映射。
name中的屬性名稱
column表中的主鍵名稱 column它也能夠省略,這時列名就與類中屬性名稱一致
length 字段長度
type屬性 指定類型
<generator>它主要是描述主鍵生成策略.
關於<property>標籤
它是描述類中屬性與表中非主鍵的映射關係
核心配置文件
hibernate.cfg.xml
hibernate.properties
放到src下api

 

hibernate中的數據類型
 安全

標準SQL數據類型
Java數據類型
Hibernate數據類型
TINYINT
byte、java.lang.Byte
byte
SMALLINT
short、java.lang.Short
short
INGEGER
int、java.lang.Integer
integer
BIGINT
long、java.lang.Long
long
FLOAT
float、java.lang.Float
float
DOUBLE
double、java.lang.Double
double
NUMERIC
java.math.BigDecimal
big_decimal
CHAR(1)
char、java.lang.Character
character
BIT
boolean、java.lang.Boolean
boolean
VARCHAR
java.lang.String
string
CHAR(1)('Y'或'N')
boolean、java.lang.Boolean
yes_no
CHAR(1)('Y'或'N')
boolean、java.lang.Boolean
true_false
DATE
java.util.Date、java.sql.Date
date
TIME
java.util.Date、java.sql.Time
time
TIMESTAMP
java.util.Date、java.sql.Timestamp
timestamp
TIMESTAMP
java.util.Calendar
calendar
DATE
java.util.Calendar
calendar_date
VARBINARY、BLOB
byte[]
binary
CLOB
java.lang.String
text
VARBINARY、BLOB
java.io.Serializable
serializable
CLOB
java.sql.Clob
clob
BLOB
java.sql.Blob
blob
VARCHAR
java.lang.Class
class
VARCHAR
java.util.Locale
locale
VARCHAR
java.util.TimeZone
timezone
VARCHAR
java.util.Currency
currencysession

hibernate工做原理app

由hibernate.cfg.xml中的<mappingresource="com/xx/User.hbm.xml"/>讀取解析映射信息。
經過config.buildSessionFactory();//獲得sessionFactory。
sessionFactory.openSession();//獲得session。
session.beginTransaction();//開啓事務。
persistent operate;
session.getTransaction().commit();//提交事務
關閉session;
關閉sessionFactory;
 框架

c3p0鏈接池配置
<!-- 設置鏈接提供者 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

<property name="hibernate.c3p0.max_size">20</property> <!-- 最大鏈接數 -->
<property name="hibernate.c3p0.min_size">5</property> <!-- 最小鏈接數 -->
<property name="hibernate.c3p0.timeout">50</property> <!-- 超時等待時間 -->
<property name="hibernate.c3p0.idle_test_period">3000</property> <!--空閒鏈接時間 -->
Seesiondom

如何解決session的線程不安全問題?
在方法內部建立、使用便可
經常使用api
sessionFactory.openSeesion();須要手動調用close()方法關閉
sessionFactory.getCurrentSession();提交事務或回滾時自動close,須要在覈心配置文件中配置以下屬性
<property name="hibernate.current_session_context_class">thread</property>
save()
update()
delete()
get()
load()
saveOrUpdate()
createQuery()操做hql
createSQLQuery()操做本地sql
createCriteria()完成條件查ide

Transaction

開啓事務:        session.beginTransaction()
提交: commit(),session.getTransaction().commit()
回滾 rollback(),session.getTransaction().rollback()
若是沒有開啓事務,那麼session的每個操做都是一個事務,且事務默認不提交
一對一關係添加關聯映射1.在任意一方添加外鍵,指向另外一方的主鍵.
2.兩個主鍵一致.

在pojo中設置私有對象字段.

class Employee{
    private Archives archives;
}
class Archives{
    provate Employee employee;
}

對多關係添加關聯映射(也叫多對一)
1.在多的一方建立外鍵列指向一的一方的主鍵.

class Cutomer{
    private Set<Order> orders;
}
class Order{
    private Costomer costomer;
}
一對多的hbm映射文件costomer.hbm.xml配置<!--客戶中的訂單是多,因此是one-to-many--><set>        <key column="和多的一方共同維護的外鍵列名稱"></key>        <!--指明客戶pojo中訂單的泛型-->        <one-to-many class="訂單的全類名"></one-to-many></set>

order.hbm.xml配置<!--order是多因此用的是many-to-many-->                                                                                                                                        //通常多的一方維護外鍵<many-to-one name="當前pojo中的客戶對象名稱" class="指明客戶對象類的全路徑" column="建立外鍵列的名稱"></many-to-one>

封裝數據時候,咱們都是雙向關聯,這種寫法比較繁瑣...

雙向關聯測試問題:必須配置表自自動刷新表結構<property name="hibernate.hbm2ddl.auto">update</property>我建立了一個客戶,客戶有三個訂單,相互建立關係,若是在配置文件中不配置cascade="save-update"屬性也能夠執行成功,首先插入了一個costomer對象,讓後三個訂單,最後更新訂單表中的外鍵,這樣的話,屬實浪費資源.問題:cascade的做用是什麼?問題:could not execute statement        沒法執行語句

單項關聯測試org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: cn.hibernate.domain.Customer若是不設置 cascade="save-update"就會報上面錯誤,表明一個持久化對象關聯了一個瞬時對象通常在多的一方設置cascade="save-update",由於多的一方設置delete,他會將一的一方也會刪除,將一的一方刪除,隨之又會將一的一方的全部關聯字段都會刪除.

級聯刪除在操做級聯刪除的前提條件必須將設置級聯,這樣保證數據完整性.在一的一方設置 cascade="delect" 級聯刪除在刪除用戶時候,底層是先查詢出來該用戶,在查詢該所屬該用戶的全部訂單,先設置爲null,而後在逐個刪除.

註解開發如何配置實體類@Entity@Table(name="表名稱",catalog="數據庫名稱")@id@GeneraterValue(strategy=GenerationType.IDENTITY)@Column(name="列名稱",length=.nullable="true")@Temporal//日期@Transient 忽略字段若是不想在數據庫中生成那個字段

主鍵生成策略爲UUID@ID@genericGenerator(name="myuuid",strastegy="uuid").....

Hibernate檢索方式概述1.對象導航圖檢索方式經過映射關係,經過導航方式,檢索他關聯的持久化對象信息.例如Customer c = session.get(Customer.class,2);c.getOrders().size();

2.oid檢索方式Session.get(Customer.class,3);session.load(Order.class,1);經過先獲取oid操做持久化對象.

3.hql檢索方式1.重點:hql基本語法 String sql= "from Customer";Query query = session.createQuery(sql);List<Customer> list = query.list();2.排序 desc降序 asc升序String sql ="from Order order by money";(根據對象屬性)3.條件查詢(查詢價格大於2000)String sql = "from Order where  money >?";Qeruy query = session.createQuery(sql);query.setParameter(0,/範圍/);query.list();4.分頁檢索String sql="form Order";Query query = session.createQuery(sql);query.setFirstResult((2-1)*9);query.setMaxResult(9);List<Order> list = query.list(); 5.分組String sql = "select sum(money) from Order group by c";(根據c)6.投影查詢(查找指定的字段)String sql = "select new Customer(name,address) from Costomer";注意:必須提供無參構造和指定的構造.7.命名查詢:現將hql語句定義出來,經過Session.getNameQuery("名稱");聲明位置:1.在對應的hbl.xml中配置<query name="名稱">        from Costomer</query>2.在實體中定義方法@Qeruy(name="方法名稱","");

4.qbc檢索方式query by criteria,一種更加面想對象的檢索方式criteria對象qbc步驟:1.獲得對象session.createCriteria();2.設定條件3.調用list()1)基本檢索@Test//查詢全部客戶 public void Test1(){    Session session = HibernateUtils.openSession();    session.beginTransaction();    Criteria criteria = session.createCriteria(Customer.class);    List<Custeria>list = criteria.list();    session.getTransaction().commit();    session.close();}2)排序檢索@Test//根據訂單價格排序puiblic void Test(){    Session session = HibernateUtils.openSession();    session.beginTransaction();    Criter criter = session.createCriteria(Order.class);    criter.addOder(org.hibernate.criterion.Order.desc("money"));    List<Order> list = criter.list();    System.out.println(list);    session.getTransaction().commit();    session.close();}3)條件檢索@Test//查詢名稱叫張某public void Test3(){    Session session = HibernateUtils.openSession();    session.beginTransaction();           //查詢名稱叫張_的人           Session session = session.createCriteria(Customer.calss);           Criterion like = Restrictions.like("name","張_");           criter.add(like);           Customer customer = criteria.list();&criteria.uniqueResult();           System.out.println(customer);    session.getTransaction().commit();    session.close();}多個條件檢索:!!!統計查詢Object obj = criteria.setProjection(Projections.rowCount()).uniqueResult();System.out.prinln(obj) ---204)離線條件查詢DetachedCriteria dc = DetachedCriteria.()

三種主鍵開發一對一註解兩種外鍵映射(主要),主鍵映射,在任意一方添加一列做爲外鍵在一方建立外鍵列@JoinColumn(name="外鍵名稱")在另外一方放棄對外鍵列的維護@OneToOne(targetEntity=目標實體.class,mappedBy="另外一方的字段類")

一對多主鍵一的一方配置@OneToMany(targetEntity=多的一方的.class,mappedBy="外鍵交給多的一方管理",orphanRemoval)多的一方配置@ManyToOne(targetEntity="一的一方的.class")@JoinColumn(name="外鍵名稱")級聯操做根據實際狀況而定@Cascade(CascadeType.SAVE-UPDATE)

事務四種隔離級別READ_UNCOMMITED 讀取未提交,它引起全部的隔離問題READ_COMMITTED 讀已提交,阻止髒讀,可能發生不可重複讀與虛讀.REPEATABLE_READ 重複讀 阻止髒讀,不可重複讀 可能發生虛讀SERIALIZABLE 串行化 解決全部問題 不容許兩個事務,同時操做一個目標數據。 (效率低下)ORACLE 默認的是事務隔離級別 READ_COMMITTEDMYSQL 默認的事務隔離級別 REPEATABLE_READ