??xml version="1.0" encoding="utf-8" standalone="yes"?>
以下软g试环境为Spring,Struts1
1、通过struts1提供的插件机Ӟ采用Spring提供的ContextLoaderPlugIn
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<global-exceptions />
<global-forwards />
<message-resources parameter="com.portal.ApplicationResources" />
<!-- 通过S1提供的插件机制来初始化Spring容器Q加载Spring配置文g
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<!--
1、ContextLoaderPlugIn默认加蝲配置文g命名规则是actionServlet-servlet.xml,其中actionServlet
是配|org.apache.struts.action.ActionServlet时指定的servlet名称
2、通过配置contextConfigLocation属性来指点Spring配置文g的位|?多个配置文g可以使用 逗号","、分?;"、空? "
-->
<set-property property="contextConfigLocation"
value="/WEB-INF/conf/spring-application.xml,/WEB-INF/conf/**/spring*.xml" />
</plug-in>
-->
</struts-config>
2、采用Spring提供的ContextLoaderListener来初始化(应用服务器需要支持Listener,Servlet2.3版本及以?
<context-param>
<description>通过配置contextConfigLocation属性来指点Spring配置文g的位|?多个配置文g可以使用 逗号","、分?;"、空? "</description>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/conf/spring-application.xml /WEB-INF/conf/**/spring*.xml</param-value>
</context-param>
<listener>
<description>通过ContextLocaderListener来初始化Spring容器Q加载Spring配置文g</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
3、采用load-on-startup Servlet 来初始化Spring容器
<servlet>
<description>
通过load-on-startup Servlet来初始化Spring容器
该如何Servlet 用于提供"后台"服务Q作为容器管理应用中的其他beanQ不需要响应客戯求,因此无须配置servlet-mapping
</description>
<servlet-name>applicationContext</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
Hibernate学习W记
1?/span>Hibernate核心cM接口
1-1.Configurationc?/span>
ConfigurationcLHibernate的入口,它负责配|和启动Hibernate,Hibernate框架通过Configuration实例加蝲配置文g信息(hibernate.cfg.xml),然后d指定对象关系映射文g(bean.hbm.xml)的内容ƈ创徏SessionFactory.
1-2.SessionFactory接口
SessionFactory接口负责初始?/span>Hibernate,一?/span>SessionFactory实例对应一个数据存储源(一般就是指一个数据库)。应用程序从SessionFactory中获?/span>Session实例?/span>SessionFactoryh以下特点Q?/span>
1) U程安全Q即同一?/span> SessionFactory实例可以被应?/span> 的多个线E共享?/span>
2) 它是重量U的 Q因为它需要一个很大的~存Q用来存N定义?/span>SQL语句以及映射元数据等?/span>
所以说 Q如果一个应用程序中只访问一个数据库 Q则只需要创Z个全局?/span> SessionFactory实例?/span>
1-3.Session 接口
Session?/span>Hibernate中应用最频繁的接口?/span>Session也被UCؓ持久化管理器 Q它负责理所有与持久化相关的操作Q如存储、更新、删除和加蝲对象{?/span>Session接口h以下特点Q?/span>
1) 单线E,非共享的对象。线E不安全Q在设计软g架构时候,应该避免多个U程׃n同一?/span>session实例?/span>
2) Session 实例是轻量的,它的创徏和销毁不需要消耗太多的资源。可以ؓ每个请分配一?/span>Session实例Q在每次hq程汇d时创建和销?/span> Session实例?/span>
3) Session有一个缓存,它存攑ֽ前工作单元加载的对象?/span>Session的缓存被UCؓHibernate的一U缓存?/span>
1-4.Transaction接口
Transaction接口?/span> Hibernate框架的事务接口。它对底层的事务接口做了装Q包括:JDBC API?/span>JTA.q样使得Hibernate应用可以通过一致的Transaction接口来申明事务边界,q有助于应用E序再不同的环境和容器中UL?/span>
1-5.Query?/span>Criteria接口
它们?/span> Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的q程?/span>Query包装了一?/span> HQL(Hibernate Query Language)Q?/span>Criteria接口完全装了基本字W串形式的查询语句,?/span>Query更加面向对象Q?/span>Criteria接口擅长于执行动态查询?/span>
2?/span>Hibernate中常用的事务隔离U别
帔R |
?/span> |
说明 |
TRANSACTION_NONE |
0 |
不支持事?/span> |
TRANSACTION_READ_UNCOMMITTED |
1 |
指示可以发生脏读Q?/span>dirty readQ、不可重复读和虚读(phantom readQ的帔R。此U别允许被某一事务更改的行在已提交该行所有更改之前被另一个事务读取(“脏读”Q。如果所有更攚w被回滚,则第二个事务获取无效的行?/span> |
TRANSACTION_READ_COMMITTED |
2 |
指示不可以发生脏ȝ帔RQ不可重复读和虚d以发生。此U别只禁止事务读取其中带有未提交更改的行?/span> |
TRANSACTION_REPEATABLE_READ |
4 |
指示不可以发生脏d不可重复ȝ帔RQ虚d以发生。此U别止事务d带有未提交更改的行,它还止q种情况Q一个事务读取某一行,而另一个事务更改该行,W一个事务重新读取该行,q在W二ơ读取时获得不同的|“不可重复?#8221;Q?/span> |
TRANSACTION_SERIALIZABLE |
8 |
指示不可以发生脏诅R不可重复读和虚ȝ帔R。此U别包括TRANSACTION_REPEATABLE_READ 中禁止的事项Q同时还止出现q种情况Q某一事务d所有满?/span> WHERE 条g的行Q另一个事务插入一个满?/span> WHERE 条g的行Q第一个事务重新读取满相同条件的行,q在W二ơ读取时获得额外?#8220;?#8221;行?/span> |
3?/span>Hibernate中实例的状?/span>
3-1Q时状?/span>
该实例从未与M持久化上下文兌q。它没有持久化标识(相当于主键|Q时状态下的对象有如下特征?/span>
1Q?span style="font: 7pt 'Times New Roman'"> 不处?/span>Session~存中,也可以说不被M一?/span>Session兌
2Q?span style="font: 7pt 'Times New Roman'"> 在数据库中没有对应的记录
在以下情况下Q?/span>Java对象q入临时状?/span>
1Q?nbsp;当通过new语句刚创Z?/span>Java对象Q它处于临时状态,此时不和数据库中的Q何记录对应?/span>
2Q?nbsp;Session?/span>delete()Ҏ能一个持久化或时脱对象{换ؓ临时对象。对于脱对象,delete()Ҏ从数据库中删除与它对应的记录Qƈ且把它从Session~存中删除?/span>
3-2Q持久化状?/span>
该实例目前与某个持久化上下文有关联,它拥有持久化标识Q相当于主键|Qƈ且可能在数据库汇L一个对应的行。对于某一个特定的持久化上下文Q?/span>Hibernate保证标识?/span>Java标识Q其g表对应在内存中的位置Q等仗持久化对象有以下特征?/span>
1Q?nbsp;位于一?/span>Session实例的缓存中Q也可以_持久化对象L被一?/span>Session实例兌?/span>
2Q?nbsp;持久化对象和数据库中的相兌录对应?/span>
3Q?nbsp;Session在清理缓存时Q会Ҏ持久化对象的属性变化,来同步更新数据库?/span>
Session的许多方法都能够触发Java对象q入持久化状态?/span>
4Q?nbsp;Session?/span>save()的方法能够把临时对象转变成持久化对象?/span>
5Q?nbsp;Session?/span>load()?/span>get()Ҏq回的对象L处于持久化状态?/span>
6Q?nbsp;Querycȝlist()Ҏq回?/span>list集合中存攄都是持久化对象?/span>
7Q?nbsp;Session?/span>update()?/span>saveOrUpdate()?/span>lock()Ҏ使脱对象{变ؓ持久化对象?/span>
当一个持久化对象兌一个时对象时Q在允许U联保存的情况下Q?/span>Session在清理缓存时会把q个临时对象也{变成持久化对象?/span>Hibernate保证在同一?/span>Session实例的缓存中Q数据库表中的每条记录只对应唯一的持久化对象Q也是说在一?/span>Session?/span>load/get同一?/span>OID得到 的是相同的对象?/span>
3-3Q脱状?/span>
实例曄与某个持久化上下文发生过兌Q不q那个上下文被关闭了Q或者这个实例是被序列化(serialize)到另外的q程。它拥有持久化标识,q且在数据库中可能存在一个对应的行。对于脱状态的实例Q?/span>Hibernate不保证Q何持久化标识?/span>Java标识的关pR?/span>
q对象h以下特征?/span>
1Q?span style="font: 7pt 'Times New Roman'"> 不再位于Session的缓存中Q也可以_q对象不被Session兌?/span>
2Q?span style="font: 7pt 'Times New Roman'"> q对象是有持久化对象{变过来的Q因此在数据库中可能q存在与它对应的记录(前提条g是没有其他程序删除了q条记录)?/span>
3Q?span style="font: 7pt 'Times New Roman'"> q对象与时对象的相同指出在于两者都不被Session兌Q因?/span>Hibernate不会保证他们属性变化与数据库保持同步。脱对象与临时对象的区别在于前者是由持久化对象转变q来的,因此可能在书库中q存在对应的记录Q而后者在数据库中是没有对应的记录的?/span>
Session的以下方法持久化对象{变成q对象.
1) 当调?/span>Session?/span>close()ҎӞSession 的缓存被清空Q缓存中的所有持久化对象都变对象,如果在应用程序中没有引用变量引用q些q对象Q他们就会结束生命周期?/span>
2) Session?/span>evict()Ҏ能够从缓存中删除一个持久化对象Q它变状态,?/span>Session的缓存中保存了大量的持久化对象时Q会消耗许多内存空_Z提高性能Q可以考虑调用evict()ҎQ从~存中删除一些持久化对象。但是多数情况下不推荐用该ҎQ而应该通过查询语言Q或者显C的D来控制对象图的深度?/span>