hibernate notes

---------------------------------
线程绑定
自动脏检查
映射文件以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

你可能感兴趣的:(sql,Hibernate,jdbc,ibatis,OO)