---------------------------------
线程绑定
自动脏检查
映射文件以java为中心
XDoclet,Middlegen,AndroMDA
sql
creteria
hql
當您使用new建構Configuration物件時,會讀取Classpath路徑下的 hibernate.properties,如果您呼叫Configuration的configure()方法沒有指定路徑與檔案名稱時,則會再讀取 Classpath路徑下的hibernate.cfg.xml,如果有與hibernate.properties相同的屬性設定,則 hibernate.cfg.xml中的設定會覆蓋hibernate.properties中的設定。
如果您將Transient狀態的物件使用Session的save()方法加以儲存,或是使用Hibernate從資料庫載入資料並封裝為物件(例如使用get()、load()等查詢物件的相關方法),則該物件為Persistent狀態。
Detached狀態的物件可以使用update()方法使之與資料庫中的對應資料再度發生關聯,此時Detached狀態的物件會變為 Persistent狀態。
如果您使用Session的實例delete()方法刪除資料,Persistent狀態的物件由於失去了對應的資料,則它會成為Transient狀態。
對Java而言,要識別兩個物件是否為同一個物件有兩種方式,一種是根據物件是否擁有同樣的記憶體位置來決定,在Java語法中就是透過== 運算來比較,這是Java所定義的物件識別(Object identity),一種是根據equals()、hasCode()中的定義,這是Java所定義的物件相等(Object equality)。
在Hibernate中,如果是在同一個session中根據相同查詢所得到的相同資料,則它們會擁有相同的Java識別.
Validatable、Lifecycle、Interceptor
當物件實作Lifecycle介面時,會在save()、update()、delete()、load()等方法執行之前呼叫對應的onSave()、 onUpdate()、onDelete()與onLoad(),其中onSave()、onUpdate()、onDelete()與onLoad() 若傳回true或丟出CallbackException,則對應的操作中止。
如果定義時實作了Validatable介面,當物件被持久化之前會呼叫validate()方法,如果丟出ValidationFailure,則驗證失敗,物件的資料不會儲存至資料庫中。
使用Criteria進行查詢時,不僅僅能組合出SQL中where子句的功能,還可以組合出如排序、統計、分組等的查詢功能。
HQL本身不區分大小寫,不過要注意類別的名稱必須區分大小寫。
在查詢類別對應的表格時,需注意到繼承的問題,Hibernate會自動判定繼承關係
如果要查詢兩個以上的屬性,則如下,查詢的結果會以陣列的方式傳回:
如果User類別提供有適當的建構方法,則可以在使用HQL時直接指定新建一個物件傳回
可以使用distinct去除資料重複的記錄
unidirectional, many-valued associations
in hibernate , all java types are considered values type
This is conceptually very different from a collection of references to other entities, but looks almost the same in Java
hbm,pojo,schema
ddl(MiddleGen)hbm(hbm2java)pojo
pojo(xdoclet)hbm(schemaExport)ddl
半自动化iBatis[关注O/R,而SQL操作还给用户]
只有sql,没有shema
只用pstmt
性能要求
=========================================================================
第一:jdbc直接编码,处理异常
第二:静态类读取配置文件
第三:jdbc获取连接操作独立,以使用连接池
DAO = Data accesser Abstraction + Active Domain Object
SessionFactory线程安全,Session非线程安全
Query:hql,nativeSQL
Criteral:oo
数据库连接:
jdbc:driver,url,user,pwd,dialect
jndi:datasource,user,pwd,dialect
连接池:
jdbc连接时使用。
默认:hibernate.connection.pool_size=2
c3p0:推荐
proxool
dbcp
后三种要指定hibernate.connection.driver_class
DBCP很聪明,把Commons-Pool和JDBC的driver封装起来,使达到连接池的目的
事务管理:
hibernate.transaction.factory_class
jdbc:org.hibernate.transaction.JDBCTransactionFactory
jpa:org.hibernate.transaction.JTATransactionFactory
O/R映射
基本数据类型(hibernate数据类型,java数据类型[用户自定义数据类型],SQL数据类型)
1。实体映射基础
2。高级实体映射
3。实体映射策略[粒度,层次]
1。实体映射基础
表类映射:表名类名,字段,主键
从设计角度推荐主键与业务无关,否则业务逻辑变更将对底层数据产生影响
数据库提供的逐渐生成机制往往牵涉到加锁和解锁,搞并发时可能会很慢,如果用Sequence的话就一次添加就有两次数据库访问
动态模型:
与实体类型无关的映射,用通用数据容器保存数据库中的纪录
xml文件中指定entity-name代替name
java中1.openSession(EntityMode.MAP);2.session.save("EntityName",instanceName)
map,pojo,dom4j,parse
对rs的改进形式,违背oo
2。高级映射
自定义数据类型
复合主键
composit-id
基于实体类的复合主键
composit-id; 实现equals和hashcode,以及serializable
对于load,实体类也担当这复合主键的功能.
基于主键类的复合主键
类实现equals,hashcode,serializable
BLOB,CLOB
3。实体映射策略
面向设计[横向]
component:没有id
还是一个表,但是逻辑上被分成了多个类
面向性能[纵向]
blob或者clob字段读取代价较高[延迟加载,在Hibernate2中使用对象的继承层次]
子类中用polymorphism="explicit"声明为显示多态.这样只有显示的用此类名进行读取时才会
4。实体层次设计
table per subclass
table per concreate class
table per class hierarchy
5。数据关联
1。一对一
一对一主键
一对一唯一外键
mapping文件
hibernate-mapping: default-cascade
default-access:
default-lazy:
auto-import:[方便hql使用]
package:本文件的默认package name
class:
discriminator-value:多态支持
polymorphism:多态模式设定
mutable:类是否会发生改变。如日志只有添加,不会修改。可以提高性能
proxy:为Lazy-Loading提供支持
lazy:
dynamic-update,dynamic-insert:纪录数量大或者容量大时提高效率
select-before-update:
where:自动添加条件[权限控制]
batch-size:
optimistic-lock:
entity-name:动态模型,不用java类
id:
unsaved-value:判断对象是否已经保存的判定值
property:
update,insert:update或者insert时是否必须包含次字段,默认为true
formular:数据库中没有的字段,而是通过计算得来的。
unique,not-null
one-to-one
name
class
cascade
constrained
fetch
property-ref
access
hibernate advanced feature
1.hibernate persistance implemention
life cycle
object identity
data cache
transaction mgmt
persist opration
2.hibernate callback and interceptor
lifecyle and validatable
hibernate interceptor
fine-grained means more classes than tables.
An object reference to an entity instance is persisted as a reference in the database
key lifecycle
database identity; Identity; equals;
Whether field or property access is enabled for an entity depends on the position of the mandatory @Id annotation
@Entity(name="") to change entity's name in hql
Value type:
jdk's basic
User's custom
if the class of the property is annotated as @Embeddable, it’s mapped as a component of the owning class
unidirectional composition is far more common
embedded will add multi columns in current table