??xml version="1.0" encoding="utf-8" standalone="yes"?> 入门Q?br />
配置Struts数据库连接池 ?1 struts uml?/strong> 1、fetch 的优先高于 lazyQ一般情况下Q另外一般情况下除外Q下会讲到Qfetch的优先高于 lazyQ若出现?fetchQ则忽略 lazy?/p>
2、在配置文g中多对一Ӟ一定要明确声明 lazy=false ?trueQ在多对一Ӟ默认情况下,lazy 即不?true 也不?false。你若不明确指出Q它执行的时候是按照 lazy=true q种方式执行的,但是你若明确写上 lazy=trueQ指报出错误Q一般情况下明确写上 lazy=false?/p>
3、你的代码若?Student student = (Student)session.get(Student.class, 1)Qhibernate 会正按照配|文件的{略来执行,?fetch 则执行fetchQ有 lazy 则执?lazyQ但你的代码若像 Query query = session.createQuery("from Student")Q它会忽略配|文件中?fetchQ它不会执行 fetch=joinQlazy 会被正确执行QStudent 的属性(q里假定是TeamQ它是对象)的配|文件中?fetch 会被正确执行?/p>
4、Query query = session.createQuery("from Student s left outer join s.team")Q会忽略 Student ?Team cȝ配置文g?fetchQ但它们cM?lazy 会被正确执行?br />
Struts2.0标签库(三)表单标签
?Struts 2深入详解 by.孙鑫
描述
对于表单标签,分ؓ两种标签:form标签本n,和所有来包装单个的表单元素的其他标签.form标签本n的行Z同于它内部的元素,q是很重要的.在我们ؓ所有表单标{?包括form标签在内,提供一个参考手册之?我们必须先描qC些通用的属?
通用属?br />
属?/strong>
Theme
数据cd
描述
cssClass
simple
String
定义 html class 属?
cssStyle
simple
String
定义html style 属?
title
simple
String
定义html title 属?
disabled
simple
String
定义html disabled 属?
label
xhtml
String
定义表单元素的label
labelPosition
xhtml
String
定义表单元素的label位置(top/left),~省为left
requiredposition
xhtml
String
定义required 标识相对label元素的位|?(left/right),~省?right
name
simple
String
表单元素的name映射
required
xhtml
Boolean
在label中添?* (true增加,否则不增?
tabIndex
simple
String
定义html tabindex 属?
value
simple
Object
定义表单元素的value
Javascript相关属?br />
属?
Theme
数据cd
描述
onclick
simple
String
html javascript onclick 属?
ondbclick
simple
String
html javascript ondbclick 属?
onmousedown
simple
String
html javascript onmousedown 属?
onmouseup
simple
String
html javascript onmouseup 属?
onmouseover
simple
String
html javascript onmouseover 属?
onmouseout
simple
String
html javascript onmouseout 属?
onfocus
simple
String
html javascript onfocus 属?
onblur
simple
String
html javascript onblur 属?
onkeypress
simple
String
html javascript onkeypress 属?
onkeyup
simple
String
html javascript onkeyup 属?
onkeydown
simple
String
html javascript onkeydown 属?
onselect
simple
String
html javascript onselect 属?
onchange
simple
String
html javascript onchange 属?
]]>
Struts2权威指南--ZWebWork核心的MVC开?nbsp; 作者:李刚
曦_Struts2应用开发系?nbsp;讲师Q风中叶
Max On Java ?Struts 2.0 pd
一、前a
Struts2 ?WebWork 的升U。它同样适用拦截器作为处理(AdviceQ,以用L业务逻辑控制器ؓ目标Q创Z个控制器代理?br />
Tomcat 文g服务器配|项目:
</Host>
pathQURL虚拟路径
docBaseQ对应的物理地址
reloadableQ是否自动更斎ͼ发布后徏议ؓ false
对于Struts和Spring两种MVC框架的比?/a>
q阶Q?br />
用Struts建立MVC应用的介l?
? Struts框架的组件结构图
]]>
ȝ来说是gq加载,在写试cȝ时候没问题Q但是应用到 web 面׃出错。或者升U下 Hibernate 版本能修正这个错误?br />
相关Q?nbsp;谈hibernate lazy fetch
]]>
1、事?/strong>
1-1、类?/p>
?本地事务
如果事务只和一个资源管理器有关Q则为本C物。在本地事务中,事务理器只是将事务的管理委托给底层的资源管理器?/p>
?分布式事?br />
分布式事务和多个可能不同的资源管理器以一U协调的方式q行交互?/p>
1-2、Java 中事务处?/p>
JDBC 事务Q由底层数据库事务管理器控制Q操作比较简单,但是不适合控制多个应用E序lg的事务,q且没有传播的上下问?/p>
JTA ?JTSQJava 事务 API ?Java 事务服务Q可以跨多个组件和数据库用事务。在应用E序使用 JTA 控制事务操作Ӟ需要从 JNDI 上下文中获取 UserTranscation 和数据源?br /> UserTranscation ut = (UserTranscation) ctx.lookup("UserTranscation");
1-3、Hibernate 事务
?Z JDBC
Transcation 事务对象必须?Session 中获取,即事务必d一?Session 相关联?/p>
采用 Hibernate 内置?current session 和上下文理?br />
<property name="current_session_context_class">thread</property>
...
sessionFactory.getCurrentSession().beginTranscation();
?Z JTA
提供了跨 Session 的事务管理能力?br /> 使用 SessionFactory.getCurrentSession() Ҏ化事务上下文的传播,卛_事务l定 Session?/p>
虽然一?Session 范围内可以存在多个事务操作,但是 Hibernate q不支持嵌套的事务模型?br />
tx1
tx2
...
tx2.commit();
//数据库操作,操作无效
tx1.commit();
如果事务都是串行执行Q则许多资源处于空闲状态。ؓ了充分利用资源,发挥数据库共享资源的优势Q必d许多个事务ƈ发地执行?/p>
在单处理机系l中Q事务ƈ发执行实际上是这些ƈ行事务轮交叉执行,即交叉ƈ发方式,q不是真正的q行执行。在多处理机pȝ中,每个处理行一个事务,实现事务真正意义上的q存q行Q即同时q发方式?/p>
当多个用户ƈ发地存取数据库时Q就会生多个事务同时存取同一数据的情c所以,必须实现一个控制系l,使一个事务所做的修改不会对其他事务所做的修改产生负面影响Q这是q发控制?/p>
2-1、封?/p>
对ƈ发操作进行的正确调度Q防止ƈ发操作破坏了事务的隔L。采用封锁技术,事务 T 可以向系l发求,Ҏ个对象例如表、记录加锁,在事?T 释放锁之前,其他事务不能更新q些数据对象?br />
基本的封锁有Q?
排他锁(Exclusive LocksQX 锁)Q写锁或者独占锁?br />
׃n锁(Share LocksQS 锁)Q读锁。允许和其他事务一赯取数据对象DQ但不能对D 做Q何修攏V?/p>
2-2、事务隔?/p>
使用锁技术,事务对申L资源加锁Q但是会影响数据库性能。根据数据对象封锁的E度Q可以分成多U不同的事务隔离U别?/p>
数据q发执行Ӟ产生不一致的现象Q?/p>
丢失更新QLost UpdateQ?br /> 两个事务d同一数据q修改,然后提交修改QT2 提交的结果破坏了 T1 提交的结果,D T1 的修改丢失?/p>
?不可重复?br /> 事务T1 d数据后,事务T2 执行了同一数据的跟新操作,使得事务 T1 无法再现前一ơ读取的l果?br /> 事务1 d某一数据后,事务2 对该数据作了修改Q事? 再次dӞ得到数据和前一ơ不一致?br /> ?事务1 d某一些记录后Q事? 删除了同一数据源的部分数据Q事? 再次dӞ发现某些记录丢失?br /> ?事务1 d某一些记录后Q事? 插入了同一数据源的新数据,事务1 再次dӞ发现某些记录增加?/p>
??#8220;?#8221;数据
事务T1 修改某一数据Qƈ其写回物理数据库。事务T2 d同一数据后,事务T1 ׃某种原因被撤销Q数据库已l修改的数据恢复原|D事务T2 保持的数据和数据库中的数据生了不一致?/p>
ANSI SQL-99 标准定义了下列隔ȝ别:
?未提交读QRead UncommittedQ:隔离事务的最低别,只能保证不会d到物理上损坏的数据。H:1Q允生:①②?/p>
?已提交读QRead CommittedQ:常见数据库引擎的默认U别Q保证一个事务不会读取到另一个事务已修改但未提交的数据。H:2Q允生:①②
?可重复读QRepeatable ReadQ:保证一个事务不能更新已l由另一个事务读取但是未提交的数据。相当于应用中的已提交读和乐观ƈ发控制。H:4Q允生:?/p>
?可串行化QSerializableQ:隔离事务的最高别,事务之间完全隔离。系l开销最大。H:8Q允生:
在数据库中,可以手工讄事务的隔ȝ别?br />
Hibernate 在配|文件中声明事务的隔ȝ别,Hibenate 获取数据库连接后Q将Ҏ隔离U别自动讄数据库连接ؓ指定的事务隔ȝ别?br />
<property name="connection.isolation">8</property>
2-3、ƈ发控制类?/p>
Ҏ使用的锁定策略和隔离{Q可以把事务的ƈ发控制分ZU:
?悲观q发控制
用户使用旉定数据。主要应用于数据争用Ȁ烈的环境中,以及发生q发冲突时用锁保护数据的成本低于回滚事务成本的环境中?/p>
Hibernate 的悲观锁定不在内存中锁定数据Q由底层数据库负责完成?/p>
?乐观q发控制
用户d数据时不锁定数据。当一个用h新数据时Q系l将q行查该用户d数据后其他用h否更改了该数据,是则产生一个错误,一般情况下Q收到错误信息的用户回滚事务ƈ重新开始。主要用h据争用不大,且偶回滚事务的成本低于d数据旉定数据的成本的环境中?/p>
Hibernate 中用元?version ?timestamp 实现乐观q发控制模式的版本控Ӟq提供多U编E方式。版本是数据库表中的一个字D,可以是一个递增的整敎ͼ也可以是一个时间戳Q它们对?Java 持久化类的一个属性。事务提交成功后QHibernate 自动修改版本受如果另外一个事务同时访问同一数据Q若发现提交前的版本号和事前载入的版本号有出入,则认为发生了冲突Q事务停止执行,撤销操作Qƈ抛出异常。应用程序必L捉该异常q做Z定的处理?/p>
⒈应用程序别的版本控制
⒉长生命周期会话的自动化版本控制
⒊托对象的自动化版本控?br />
⒋定制自动化版本控制
Hibernate 提供两~存架构Q第一U缓存是 Session 内的~存Q第二~存是一个可插拔的缓存,能够借助W三方的lg实现。如果应用程序中l常使用同样的条件查询数据,q可以用查询缓存来提高查询效率?/p>
针对~存的范_可以?Hibernate 持久层缓存分Z个层ơ:
?事务U缓?br />
~存只能被当前事务访问。缓存的生命周期以来与事务的生命周期。事务缓存由 Session 实现。一?Session 的缓存的内容只有在本 Session 实例范围内可用?/p>
?应用U缓?/p>
~存在某个应用范围内被所有事务共享。缓存的生命周期依赖于应用程序的生命周期。应用~存?SessionFactory 实现QSession 实例由其创徏Qƈ׃n其缓存?/p>
?分布式缓?/p>
集群环境中,~存被一?JVM 或多?JVM 的进E共享。分布式~存由多个应用的缓存实例组成,~存中的数据被复制到集群环境中的每个 JVM 节点QJVM 间通过q程通信来保证缓存中数据的一致性?/p>
3-1、缓存查询结?/p>
l常使用同样的条件查询数据,则可使用查询~存。查询缓存需要和二~存联合使用Q在二~存中,可以专门为查询缓存开辟一个命名缓存区域。查询缓存启动后创Z个缓存区域,org.hibernate.cache.StandardQueryCache 实现保存查询l果集;org.hibernate.cache.UpdateTimestampsCache 实现保存最q更新的查询表的旉戟?/p>
<property name="cache.use_query_cache">true</propery>
//使用查询~存
query.setCacheable(true);
//l查询缓存指定特定的命名~存区域
query.setCacheRegion("queryCache");
//如果其他q程更新了结果集Q强行刷新缓冲区?br /> query.setCacheMode(CacheMode.REFRESH);
//h某个或全部的~存
SessionFactory.evictQueries() Ҏ
4-1、数据库q接?ConnectionProvider
J2SE 环境中用徏议?/p>
4-2、用数据源
Hibernate 中,DatasourceConnectionProvider 实现?ConnectionProvider 接口q封装了数据源的获取ҎQ充当了 Hibernate 和数据源间的适配器?/p>
J2EE 环境中用徏议?/p>
4-3、过滤数?br />
把公q数据qo条g提取出来。从 Hibernate 3.0 开始,可以利用 Hibernate Filter Ҏ个类或集合附加预先定义的qo条gQ在查询时过滤指定条件的数据。该qo器是全局有效的,使用时候,q可以指定特定参数?/p>
4-4、批量处?br />
扚w处理引发异常的根源在于缓存中保存了过多的持久化实例而耗尽内存?/p>
?应用E序U别的批处理
指定 Hibernate 处理 SQL 语句Ӟ必须U篏到指定数量后再向数据库提交操作?br /> <property name="jdbc.batch_size">20</property>
?无状?SessionQStatelessSessionQ?/p>
StatelessSession 接口没有持久化上下文Q也不负责持久化实例的生命周期,没有一U缓存,操作也不会媄响到二和查询缓存?/p>
?使用 DML 风格?HQL 语句l过内存直接q行数据处理
"delete Product p where p.id > :id"
4-4、gq加?/p>
讄延迟加蝲的属性和集合只能在该实例依附?Session 范围内被讉KQ会话关闭后Q实例从持久态{为托态,再次讉K该实例的一些属性时候,有可能会抛出 LazyInitializationException 异常?/p>
?属性gq加载(大对象)
?持久化类延迟加蝲
?集合延迟加蝲
4-5、数据抓取策略(Fetching strategiesQ?/p>
可以?Hibernate 中设定相应的数据抓取{略Q减系l生的数据库查询操作,优化pȝ性能?/p>
?Hibernate 中,延迟QlazyQ定义了一U契U,用来表示托管状态实例中那些数据是有效的Q而抓取(fetchQ是用来调整 Hibernate 性能的?/p>
4-5、监控性能
org.hibernate.stat 包提供的工具cR?/p>
5-1、XML 元数?br />
18.2. XML映射元数?- Hibernate reference 3.2.0 ga 正式版中文参考手?br />
18.3. 操作XML数据 Q通过dom4j会话d和更新应用程序中的XML文档Q?/a>
5-2、开源工L
CownewStudio 是一个基?Eclipse ?Hibernate 正向建模辅助工具。通过它用戯以图形化的方式徏立对象模型,然后Ҏ模型生成持久化类、映文件和数据库表?/p>
JDBMonitor。模拟一?JDBC 驱动来代替真正的 JDBC 驱动Q截取应用程序对数据库的操作Qƈ以合适的方式记录下来Q提供性能分析的来源和依据?/p>
?查询语句可以q回多个对象或属性,存放?Object[] 队列中?/p>
?查询结果的所有属性都存放在一?List 对象中:
select new list(xxx.xxxx,xx.xx) .....
q里?new list 是实例化 java.util.ArraryList 对象?/p>
?查询结果封装成一个安全的 Java 对象
select new EncCustomer(xx.xxx, xx.xx)....
?查询结果封装成 Map 对象Q利用别名)
select new map(xx.xxx as aaaa, xx.xxxx as bb) .....
.....
Map obj = (Map)list.get(i);
obj.get("aaaa");
obj.get("bb");
?distinct 删除重复数据
2、参数绑定机?/strong>
?
q.setParameter("name", name);
Hibernate 能根据参数值的 Java cd推断出对应的映射cdQ对于日期类型,?java.util.Date cdQ会对应多种映射cdQ这时候需要显C指定?br />
q.setParameter("date", Hibernate.DATE);
?
q.setProperties(obj);
Ҏ obj 的属性名对应 HQL 语义中定义的命名参数q行查询?/p>
3、HQL 子查?br />
用于子查询的集合函数 size()、minIndex()、maxIndex()、minElement()、maxElement() ?elements()?/p>
Session.createFilter(object, string); //qo prod 的集?items 5-1、Restrictions qol果?/p>
或者用别?br />
.createAlias("items", "ite") DEFAULTQ默?br />
EAGER/JOINQ强制立卛_?br />
LAZY/SELECTQ强制gq加?/p>
.setProjection(Projections.rowCount()) .add(Projections.groupProperty("imagePath")) ȝ查询方式?Session 范围之外定义一个离U查询,然后使用L?Session 执行查询。该Ҏ主要通过 org.hibernate.criterion.DetachedCriteria cd现?/p>
应用E序中用与数据库相关的 SQL 查询语句 6-1、Native SQL 应用E序接口 主要使用 SQLQuery.addEntity() 实现q回l果为实体的查询QSQLQuery.addScalar() 则返回标量倹{?br />
SQLQuery.addJoin(String alias, String path) 用于映对象所兌的实体或集合对应h?/p>
?xml 文g中?<! [CDATA []] > 元表C其中的内容是区分其他元素定义的U文本。例如: < W号?/p>
<sql-query name="productQuery" callable="true"> List list = query.list();
4、集合过?/strong>
对于某持久化对象?items 属性内元素性能优化Q过滤集合内数据、排序等Q?/p>
q回?Query cd
参数 object 是持久化对象的集合?br />
参数 string ?HQL 的过滤条?/p>
List items = session.createFilter(prod.getItems(),
"this.unitCost<100 order by this.ListPrice desc").List();
//l定qo的结?itmes 到属?br />
prod.setItems(items);
5、条件查?QBC
5-2、结果集排序
.addOrder(Order.asc("name"))
.addOrder(Order.desc("category"))
.list();
5-3、createCriteria() 兌查询
List list = sess.createCriteria(Product.class)
.add(Restrictions.like("name", "%o%"))
.createCriteria("items")
.add(Restrictions.ge("listPrice", new Float(100.0))
.list();
//q回一个新?Criteria 实例Q该实例引用 items 集合中的元素Qƈ且ؓ该集合元素增加了元素属?listPrice 大于{于 100.0 的过滤条件?/p>
.add(Restrictions.ge("ite.listPrice", new Float(100.0))
5-4、设|加载策?br />
.setFetchMode("items", FetchMode.EAGER)
.list();
5-5、聚合和分组 org.hibernate.criterion.Projections
.uniqueResult()Q?/p>
.list();
5-6、离U与子查?/p>
6、Native SQL 查询
6-2、命名查?br />
sess.getNamedQuery(string);
6-3、用存储过E?br />
Hibernate 3.0 以上的版本已l支持和利用存储q程来进行查询,存储q程q回的参数是标量与实体,q里可以利用q回cd的定义将存储q程q回的参数映到对象的属性中?/p>
<return alias="prod" class="petstore.domain.Product">
<return-property name="productId" column="PRODUCTID" />
<return-property name="description" column="DESCRIPTION" />
<return-property name="name" column="NAME" />
</return>
{? = call getProduct(?)}
</sql-query>
]]>
1-1、单向多对一兌
产品和分cȝ关系Q多个不同品属于同一U分cR?br /> private Category categoryQ?br /> <many-to-one name="category" column="categoryId" not-null="true" />
1-2、一对多映射
private Set products = new HashSet();
<set name="products" <!--Category 中集合属性名UCؓ products-->
table="product" <!--集合属性对应表的名UCؓ product-->
schema="test" <!--表的 schema 名称?test-->
lazy="true" <!--此集合采用g时加载策?->
inverse="true" <!--由关联属性的另一方作为关联的L?->
cascade="delete" <!--采用U联删除Q当 Category 被删除时兌的此集合内容也将被删?->
sort="natural" <!--自然排序集合内容-->
order-by="productId asc" <!--?productId 字段升序排列集合内容-->
>
<key column="category_fk" />
<one-to-many class="petstore.domain.Product" />
</set>
1-3、承映?br />
?瞬时态(TransientQ?-VOQValue OjbectQ?br /> 对象实例产生到被 JVM 垃圾回收为止q不?Hibernate 框架理?/p>
?持久态(PersistentQ?-POQPersistent OjbectQ?br />
对象实例?Hibernate 框架理Q该对象可能是刚被保存的Q或刚从数据库中被加载的。Hibernate 会检处于持久态的对象M改动Q在当前操作单元执行完毕对象与数据库同步,卛_对象的属性保存到数据库映对应的字段中。简单点说就是该实体对象?session 发生关系Q而且处于 session 的有效期内?br />
?托管态(DetachedQ?-VOQValue OjbectQ?br />
与持久对象关联的 Session 被关闭后Q对象就变ؓ托管的,可l被修改。托对象如果重新关联到某个新的 Session 上,会再ơ变为持久的Q同时改动也会被持久化到数据库。这个期间的转变q程可以看作是应用程序事务,即中间会l用h考时间的长时间运行的操作单元?br />
处于托管态对象具有与数据库表记录间的联系Q持久化标识QidentifierQ?/p>
2-2、对象操作的应用E序接口
?修改对象
对于已经持久化的对象Q不需要调用某个特定的Ҏ可以实CҎ久化Q因?Hibernate 会自动调?flush() Ҏ保证与数据库的同步?/p>
对于处于托管状态的实例QHibernate 通过提供 Session.update() ?Session.merge() ҎQ重新关联托实例。但是需要注意的是:如果h持久化标识(identifierQ的对象之前已经被另一个会话连接(secondSessionQ装载了Q应用程序关联操作会发生异常?/p>
使用 merge() ҎӞ用户不必考虑 session 的状态,可随时将修改保存到数据库中。例如:Session 中存在相同标识的持久化实例时QHibernate 便会Ҏ用户l出的对象状态覆盖原有的持久化实例的状态?/p>
另外QHibernate q提供了 saveOrUpdate()ҎQ它卛_分配新持久化标识QidentifierQ,保存瞬时QtransientQ对象,又可更新/重新兌托管的(identifierQ实例?/p>
?删除对象
通过 HQL 语句Q调用重载的 delete()Q可以一ơ删除多个对象?br />
session.delete("from Customer as c where c.customerId <3");
?查询对象
已知对象表示W值查?br />
对象标识W未知查?HQL
Ҏ某些特定条g查询 QBCQQuery By Criteria
按详例查?QBEQQuery By Example
调用数据库查?native SQL
查询条g参数 Q?查询条g参数索引Q由 0 开始?br />
查询条g实名 Qname
外置命名查询
在映文件定义查询语句,程序与查询语句分离Q?br />
<query name="CategoryById"
<! [CDATA[
from Category c where c.categoryId>? ]]>
</query>
E序调用Q?br />
Query q = sess.getNamedQuery("CategoryById");
q.setLong(0, name);
List cats = q.List();
?Query 提供?iterate() Ҏ遍历查询l果Q如果查询的l果?session 或二U缓存(second-level cacheQ中Q那么?iterate() Ҏ可以得到更好的性能?/p>
如果 JDBC 驱动支持可滚动的 ResuleSetQQuery 接口可以使用 ScrollableResultsQ允怽在查询结果中灉|UdQ需要保持数据库q接和游?cursor 处于抑制打开状态)?/p>
ScrollableResults cates = q.scroll();
cates.first()
cates.scroll(5);
?cascade ?inverse U联操作
inverse
只对 setQone-to-manyQ或 many-to-manyQ有效,对于 many-to-oneQone-to-one 无效
寚w合v整体作用
cascade
对关pL记都有效
寚w合的一个元素v作用Q如果集合ؓI,那么 cascade 不会引发兌操作
作用时机Q在 flush Ӟcommit 会自动执?flushQ,hibernate 会自行判断每?set 是否有变化,Ҏ变化?set 执行相应?SQLQif (inverse) return。即Qcascade 在前Qinverse 在后?/p>
异常Q?br /> org.hibernate.exception.ConstraintViolationException: could not insert
原因?category_fk 字段U束不能为空Q而在新徏?Product 对象时插入了I|而且兌关系?Caterogy 对象l持Q而被兌?Product 对象不知道自׃哪个 Category 对象兌。说到底是 pro 对象?categoryId gؓI?/p>
1-1、?ThreadLocal 控制 Session
应用E序Ҏ配置文g构徏应用E序q行的环境,建立全局范围内的 SessionFactory 对象。其内部包含?Hibernate q行的全部细节,是?Session 的工厂,它是U程安全的,只能在系l启动时实例化一ơ,pȝq行期间不可修改?/p>
Session 对象?Hibernate 操作数据的核心,数据库的操作、对象生命周期的理、应用事务的划分Q都需要在 Session 对象中完成。Session 对象不是U程安全的,如果试图让多个线E同时用一?Session 对象Q将会生数据乱,造成数据库的数据不一致。而且频繁开?Session 是巨大的pȝ消耗?/p>
Z安全C?Session 对象Q需要应?Java 语言中的U程l定机制--ThreadLocalQ它代表一个线E的U有存取I间Q能够隔dU程环境中的q发机制Q减?Session 对象的创建和销毁次敎ͼ降低pȝ资源费?br />
使用 Hibernate Ӟ设计生成数据库表l构的方式分成两U?/p>
1、手工用 SQL 语句设计数据表结?/p>
2、?Hibernate Ҏ映射文g自动构徏数据库模?br />
hibernate.cfg.xml:
<property name="hbm2dll.auto">creat</property>
<property name="show_sql">true</property>
log4j.properties
log4j.logger.org.hibernate.tool.hbm2dll=debug
Hibernate 自行理的数据库表结构:
?noneQ不产生M动作?br />
?createQ在应用启动Ӟ自动生成数据库表l构q导入到数据库中?br />
?create-dropQ同 createQ但在应用关闭时Q删除已生成的数据库表结构;此方式常在测试时使用?br />
?updateQ在应用启动Ӟ查持久化cd映射文g的改变,更新数据库表l构Q比如:持久化类d一个属性后QHibernate 能自动添加对应字D到对应的数据库表中?br />
?ConfigurationQorg.hibernate.cfg.ConfigurationQ?br /> Hibernate 应用的入口,它用配|文件初始化q行环境Q是 SessionFactory 的工厂。通常情况下,一个应用程序中只允许创Z个单例的 Configuration 实例?/p>
?SessionFactoryQorg.hibernate.SessionFactoryQ?br /> 是一个线E安全的高速缓存,其中包含了单一数据库和已编译映文件的元数据,在运行环境不可改变。它?Session 的工厂,q能?ConnectionProvider 中获?JDBC q接。它可能持有一个可选的能在q程U别或者集别事务间重用的数据缓存(二~存Q。SessionFactory ?Configuration 中获取,在一个应用范围中Q不允许改变?/p>
?SessionQorg.hibernate.SessionQ?br /> 单线E的短生命周期的对象Q是应用E序和持久化存储的一ơ对话。封装了一?JDBC q接Q也?Transaction 的工厂。它保持一个持久化对象的强制缓存(一U缓存)Q用来遍历对象图或者根据标识符查询对象。Session 提供了一pdҎQ可以方便地实现对象持久化操作?/p>
?TranscationQorg.hibernate.TranscationQ?br /> 可选,单线E、短生命周期的对象,应用E序用它来表CZ批Q务的原子操作。是底层 JDBCQJTA 或?CORBA 事务的抽象。一?Session 在某些情况下可能跨越多个 Transcation 事务?/p>
?ConnectionProviderQorg.hibernate.connection.ConnectionProviderQ?br /> 可选,JDBC q接的工厂和q接池,是底?Datasource ?DriverManager 的抽象应用,对应用程序不可见。可扩展实现?/p>
?TranscationFactoryQorg.hibernate.TranscationFactoryQ?br /> 可选,事务实例工厂。对应用E序不可见。可扩展实现?/p>
在最集合应用框架中Q应用程序直接?JDBC/JTAQƈ自行完成事务处理?br />
conn = DriverManager.getConnection(xxx);
conn.setAutoCommit(false);
...
conn.commit();
?暂态状态。对象刚建立Q还没有使用 Hibernate q行保存。该对象在数据库中没有记录,也不?session ~存中。如果该对象是自动生成主键,则该对象的对象标识符为空?/p>
?持久化对象。对象已l通过 Hibernate q行了持久化Q数据库中已l存在对应的记录。如果该对象是自动生成主键,则该对象的对象标识符已被赋倹{?/p>
?托管对象。该对象是经q?Hibernate 保存q或者从数据库中取出的,但是与之兌?session 已经被关闭。虽然它拥有对象标识W,且数据库中存在对应的记录Q但是已l不再被 Hibernate 理?br />
ps. [转] PO BO VO DTO POJO DAO概念及其作用Q附转换图)
5-1、关pd数据库的主键生成机制
序列生成主键Q整?br />
自动增长lgQ整?br />
全局l一标识W?GUIDQGlobally Unique IdentifierQ,字符串主?/p>
5-2、Java 环境中的对象识别机制
引用比较Q比地址 “==”
内容比较Q比数据 equals() Ҏ
5-3、Hibernate 对象识别W的作用
在生?Java 对象Ӟl标识属性分配一个唯一的|用于区分同一个类的多个不同的实例。体现在 Hibernate 中就是对象标识符?/p>
5-4、Hibernate 内置标识W生成器的用方?br />
org.hibernate.id.IdentifierGenerator 接口?/p>
ps. 映射对象标识W?/a>
5-5、用复合主键时l合标识W的使用ҎQ常用于遗留的系l中Q?br /> 嵌入式组合标识符/映射式组合标识符Q映多个主键字D和持久化类的多个属性?/p>
Hibernate JDBC 配置属?br />
hibernate.jdbc.fatch_sizeQ指?JDBC 抓取数据的数量大,非零?br />
hibernate.jdbc.batach_sizeQ允?Hibernate 使用 JDBC2 的批量更斎ͼ非零| 5 ?30
hibernate.jdbc.provider_classQ自定义?ConnectionProvider cdQ用于向 Hibernate 提供 JDBC q接
hibernate.jdbc.autocommitQ确认是否开?JDBC 自动提交功能Q默认ؓ false 不自动提?/p>
6-2、方a
屏蔽底层数据库系l的方言机制Q方便与数据库间q移?br />
MySQLQorg.hibernate.dialect.MySQLDialect
MySQL with InnoDBQorg.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAMQorg.hibernate.dialect.MySQLMyISAMDialect
6-3、Hibernate 日志pȝ
使用 Log4J 作ؓ Hibernate 的日志系l,需要将 Log4J 的库文g log4j.jar 攄到类路径下(其发布包以包?Log4J 的库文gQ。然后编写日志配|文?log4j.properties q放?classpath 路径中?/p>
Log4J 中,几个日志输出U别的顺序是Q只输出高于或等?讑֮U别 的记录?br /> trace < debug < info < warn < error < fatal
在开发模式中Q可以选择 DEBUG U别的输出;应用部v后,可以配置?ERROR?nbsp;
7-1、时间日期映类型(内置映射cdQ?/p>
Java 语言提供?java.util.Date ?java.util.Calendar 两个cd现时间的q算。此外,JDBC q提供了 java.util.Date 的三个扩展类 java.sql.Timestamp、java.sql.Time ?java.sql.Date 分别对应标准 SQL 数据cd中的 TIMESPAME/DATETIMEQ时间日期)、TIMEQ时_、DATEQ日期)?/p>
java.util.Date/java.sql.Date H:date SQL:DATE
java.util.Time/java.sql.Time H:time SQL:TIME
java.util.Date/java.sql.Timestamp H:timestamp SQL:TIMESTAMP/DATETIME
java.util.Calendar H:calendar SQL:TIMESTAMP/DATETIME
java.util.Calendar H:calendar_date SQL:DATE
7-2、自定义映射cd
关键点:如何高效地存取数据、简化编E模型、降低应用的复杂?/p>
在系l中引入持久层,负责所有相x据的持久化操作,可以为整个应用系l提供一个高层、统一、安全、ƈ发的数据持久机制?/p>
1、对象持久化技?/p>
1-1、Java 对象序列?br /> 序列化是 Java 语言中内|的轻量U数据持久化机制Q该机制可以Q何实C java.io.Serializable 接口的对象{化ؓq箋的字节流数据Q保存在文g中,或者通过|络q行传输。这些数据日后可被还原ؓ原先的对象状态?br /> ~点Q局限性大Q查询只能返回数据流的下一个对象,不提供部分的d和更斎ͼ不提供对象的生命周期理Q只是简单的d和写入,不提供ƈ发和事务Ҏ?/p>
1-2、?JDBC
JDBCQJava Database ConnectivityQ是用来讉K关系数据库系l的标准 Java API。JDBC 只是提供讉K数据的接口,其底层实现有特定的数据库厂商实现?br />
~点Q直接?JDBC 实现持久化时QSQL 语句和应用代码杂在一P逻辑混ؕ。另外直接?SQL 操作数据库,不是面向对象?/p>
1-3、?JDO
Java 数据对象QJava Data ObjectQ是 JCPQJava Community ProcessQ发布的一个规范,?Java 对象持久化的标准。JDO 仅定义了标准的编E接口,而把关系映射的定义留lY件供应商实现?/p>
1-4、实?EJB
实体 EJBQEnterpise Java BeanQ是 Java 领域的数据持久化标准?/p>
1-5、对象关pL?br /> 对象关系映射QOjbect Relation MappingQ在对象模型和关pL型之间徏立沟通的桥梁。ORM 技术封装了数据持久化的操作l节Qؓ应用E序提供了一只访问的接口Q应用E序可以专注于业务逻辑的处理。它采用 POJOQPlain Old Java ObjectQ简单的传统对象Q作为域对象的表qͼ不涉及域对象之外的技术细节,降低?ORM 技术的侵入性,实现单,便于试Q具备高扩展性?/p>
2、对象关pL模?br />
一个完整的对象关系映射框架Q应具备以下四个斚wQ?/p>
①、一个元数据映射规范Q负责持久化cR类属性的数据库表、字D늚映射Q实现对象和关系的语义连接?br /> ②、一l对象操作接口,用于完成数据的增加、删除、修改和更新{操作?br /> ③、一U面向对象的查询语言Q该语言能理解ѝ多态和兌{面向对象特性,实现Z对象的查询ƈ在对象之间导航?br /> ④、一pd与数据库现关的技术实现和最佛_践,保证pȝ的完整性ƈ提高pȝ的可用性和扩展性。比如:事务、缓存和数据抓取{略{?/p>
对象模型Q类、属性、关联) <==> 关系模型Q表、字Dc约束)
ps. <Hibernate 完全手册>
ISBN 978-7-111-23764-8
机械工业出版C?br />
侯志?余周 郑焕 {编?/p>
可选项说明Q?
1) assigned
主键由外部程序负责生成,无需Hibernate参与?
2) hilo
通过hi/lo 法实现的主键生成机Ӟ需要额外的数据库表保存主键生成历史状态?
3) seqhilo
与hilo cMQ通过hi/lo 法实现的主键生成机Ӟ只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库Q如Oracle?
4) increment
主键按数值顺序递增。此方式的实现机制ؓ在当前应用实例中l持一个变量,以保存着当前的最大|之后每次需要生成主键的时候将此值加1作ؓ主键?nbsp;
q种方式可能产生的问题是Q如果当前有多个实例讉K同一个数据库Q那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例讉KQ此方式必须避免使用?
5) identity
采用数据库提供的主键生成机制。如 DB2、SQL Server、MySQL 中的主键生成机制?
6) sequence
采用数据库提供的sequence 机制生成主键?strong>如Oralce 中的Sequence?/strong>
7) native
由HibernateҎ底层数据?strong>自行判断采用 identity、hilo、sequence
8) uuid.hex
由HibernateZ128 位唯一g生算法生?6 q制数|~码后以长度32的字W串表示Q作Z键?
9) uuid.string
与uuid.hex cMQ只是生成的主键未进行编码(长度16Q。在某些数据库中可能出现问题Q如PostgreSQLQ?
10) foreign
使用外部表的字段作ؓ主键?
一般而言Q利用uuid.hex方式生成主键提供最好的性能和数据库q_适应性?
另外׃常用的数据库Q如Oracle、DB2、SQLServer、MySql {,都提供了易用的主键生成机ӞAuto-Increase 字段或者SequenceQ。我们可以在数据库提供的主键生成机制上,采用 generator-class = native 的主键生成方式?
不过值得注意的是Q一些数据库提供的主键生成机制在效率上未必最佻I大量q发insert数据时可能会引v表之间的互锁。数据库提供的主键生成机Ӟ往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言Q此内部表中q护着当前的最大值和递增量)Q之后每ơ插入数据会dq个最大|然后加上递增量作为新记录的主键,之后再把q个新的最大值更新回内部表中Q这P一ơInsert操作可能D数据库内部多ơ表d操作Q同时伴随的q有数据的加锁解锁操作,q对性能产生了较大媄响?
因此Q对于ƈ发Insert要求较高的系l,推荐采用uuid.hex 作ؓ主键生成机制?br />
Hibernate 学习W记 http://blog.csdn.net/kangwei8655990/archive/2007/04/13/1563706.aspx
(比较全面的介l? http://feelingsea.blog.hexun.com/7294376_d.html
javaQhibernateQ标准sql数据cd之间的对应表 http://hi.baidu.com/sunjoe/blog/item/aa1ddabf07c5380f19d81feb.html