??xml version="1.0" encoding="utf-8" standalone="yes"?>
a) 配合使用org.springframework.transaction.interceptor.TransactionInterceptor和org.springframework.orm.hibernate.HibernateTransactionManagerQ下面是spring reference的例?
代码: |
<beans> ... <bean id="myTransactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="mySessionFactory"/> </property> </bean> <bean id="myTransactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager"> <ref bean="myTransactionManager"/> </property> <property name="transactionAttributeSource"> <value> product.ProductService.increasePrice*=PROPAGATION_REQUIRED product.ProductService.someOtherBusinessMethod=PROPAGATION_MANDATORY </value> </property> </bean> <bean id="myProductServiceTarget" class="product.ProductServiceImpl"> <property name="productDao"> <ref bean="myProductDao"/> </property> </bean> <bean id="myProductService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>product.ProductService</value> </property> <property name="target"> <ref local="myProductServiceTarget<"/> </property> <property name="interceptorNames"> <list> <value>myTransactionInterceptor</value> </list> </property> </bean> </beans> |
引用: |
This interceptor binds a new Hibernate Session to the thread before a method call, closing and removing it afterwards in case of any method outcome. If there already was a pre-bound Session (e.g. from HibernateTransactionManager, or from a surrounding Hibernate-intercepted method), the interceptor simply takes part in it. |
代码: |
<beans> ... <bean id="myTransactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="mySessionFactory"/> </property> </bean> <bean id="myProductServiceTarget" class="product.ProductServiceImpl"> <property name="productDao"> <ref bean="myProductDao"/> </property> </bean> <bean id="myProductService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="myTransactionManager"/> </property> <property name="target"> <ref bean="myProductServiceTarget"/> </property> <property name="transactionAttributes"> <props> <prop key="increasePrice*">PROPAGATION_REQUIRED</prop> <prop key="someOtherBusinessMethod">PROPAGATION_MANDATORY</prop> </props> </property> </bean> </beans> |
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=396860
Criteria Query 通过面向对象化的设计Q将数据查询条g装Z个对象。简单来
ԌCriteria Query可以看作是传l?/span>SQL的对象化表示Q如Q?span lang="EN-US">
Criteria criteria = session.createCriteria(User.class);
criteria.add(Expression.eq("name","Erica"));
criteria.add(Expression.eq("sex",new Integer(1)));
q里?/span>criteria 实例实际上是SQL ?/span>Select * from t_user where
name=?/span>Erica?and sex=
以观?/span>Hibernate在运行期生成?/span>SQL语句Q?span lang="EN-US">
Hibernate 在运行期会根?/span>Criteria 中指定的查询条gQ也是上面代码中通过
criteria.addҎd的查询表辑ּQ生成相应的SQL语句?span lang="EN-US">
q种方式的特Ҏ比较W合Java E序员的~码习惯Qƈ且具备清晰的可读性。正?span lang="EN-US">
为此Q不?/span>ORM实现中都提供了类似的实现机制Q如Apache OJBQ?span lang="EN-US">
对于Hibernate的初学者,特别是对SQL了解有限的程序员而言Q?/span>Criteria Query
无疑是上手的极佳途径Q相?/span>HQLQ?/span>Criteria Query提供了更易于理解的查询手D,?span lang="EN-US">
?/span>IDE?/span>Coding Assist机制Q?/span>Criteria的用几乎不用太多的学习?span lang="EN-US">
Criteria 查询表达?span lang="EN-US">
Criteria 本n只是一个查询容器,具体的查询条仉要通过Criteria.add
Ҏd?/span>Criteria实例中?span lang="EN-US">
如前例所C,Expression 对象具体描述了查询条件。针?/span>SQL 语法Q?span lang="EN-US">
Expression提供了对应的查询限定机制Q包括:
Ҏ 描述
Expression.eq 对应SQL?/span>field = value”表辑ּ?span lang="EN-US">
?/span>Expression.eq("name","Erica")
Expression.allEq 参数Z?/span>Map对象Q其中包含了多个属性-值对
应关pR相当于多个Expression.eq关系的叠加?span lang="EN-US">
Expression.gt 对应SQL中的 “field > value ?表达?span lang="EN-US">
Expression.ge 对应SQL中的 “field >= value?表达?span lang="EN-US">
Expression.lt 对应SQL中的 “field < value?表达?span lang="EN-US">
Expression.le 对应SQL中的 “field <= value?表达?span lang="EN-US">
Expression.between 对应SQL中的 “between?表达?span lang="EN-US">
如下面的表达式表C年龄(ageQ位?/span>13?/span>50?/span>间内?span lang="EN-US">
Expression.between("age",new
Integer(13),new Integer(50));
表达?span lang="EN-US">
Expression.in 对应SQL中的 ”field in …?表达?span lang="EN-US">
Expression.eqProperty 用于比较两个属性之间的|对应SQL中的?/span>field = field”?span lang="EN-US">
如:
Expression.eqProperty(
"TUser.groupID",
"TGroup.id"
);
Expression.gtProperty 用于比较两个属性之间的|对应SQL中的?/span>field > field”?span lang="EN-US">
Expression.geProperty 用于比较两个属性之间的|对应SQL中的?/span>field >= field”?span lang="EN-US">
Expression.ltProperty 用于比较两个属性之间的|对应SQL中的?/span>field < field”?span lang="EN-US">
Expression.leProperty 用于比较两个属性之间的|对应SQL中的?/span>field <= field”?span lang="EN-US">
Expression.and and关系l合?span lang="EN-US">
如:
Expression.and(
Expression.eq("name","Erica"),
Expression.eq(
"sex",
new Integer(1)
)
);
Expression.or or关系l合?span lang="EN-US">
如:
Expression.or(
Expression.eq("name","Erica"),
Expression.eq("name","Emma")
);
Expression.sql 作ؓ补充Q本Ҏ提供了原?/span>SQL语法的支持。我
们可以通过q个Ҏ直接通过SQL语句限定查询条g?span lang="EN-US">
下面的代码返回所有名UC?/span>Erica”v始的记录Q?span lang="EN-US">
Expression.sql(
?/span>lower({alias}.name) like lower(?)?/span>,
"Erica%",
Hibernate.STRING
);
其中的?/span>{alias}”将?/span>Hibernate在运行期?span lang="EN-US">
用当前关联的POJO别名替换?span lang="EN-US">
注意Expression 各方法中的属性名参数Q如Express.eq中的W一个参敎ͼQ这?span lang="EN-US">
所谓属性名?/span>POJO中对应实际库表字D늚属性名Q大写敏感Q,而非库表中的?span lang="EN-US">
际字D名U?span lang="EN-US">
Criteria 高Ҏ?span lang="EN-US">
限定q回的记录范?span lang="EN-US">
通过criteria. setFirstResult/setMaxResults Ҏ可以限制一ơ查询返?span lang="EN-US">
的记录范?/span>:
Criteria criteria = session.createCriteria(TUser.class);
//限定查询q回索结果中Q从W一百条l果开始的20条记?span lang="EN-US">
criteria.setFirstResult(100);
criteria.setMaxResults(20);
Ҏ询结果进行排?span lang="EN-US">
//查询所?/span>groupId=2的记?span lang="EN-US">
//q分别按照姓?/span>(序)?/span>groupIdQ逆序Q排?span lang="EN-US">
Criteria criteria = session.createCriteria(TUser.class);
criteria.add(Expression.eq("groupId",new Integer(2)));
criteria.addOrder(Order.asc("name"));
criteria.addOrder(Order.desc("groupId"));
Criteria作ؓ一U对象化的查询封装模式,不过׃Hibernate在实现过E中精?span lang="EN-US">
更加集中?/span>HQL查询语言上,因此Criteria的功能实现还没做到尽善尽(q点上,OJB
?/span>Criteria 实现倒是值得借鉴Q,因此Q在实际开发中Q徏议还是采?/span>Hibernate ?span lang="EN-US">
Ҏ荐的查询装模式Q?/span>HQL?/span>