- 浏览: 1508924 次
- 性别:
- 来自: 深圳
-
文章分类
- 全部博客 (523)
- JAVA (334)
- J2EE (18)
- JSP (21)
- JavaScript (14)
- it life (2)
- mobile develop (4)
- UBUNTU (14)
- Algorithm (14)
- DataBase (56)
- Browser/Server (1)
- linux (6)
- fedora (2)
- CSS (1)
- AjAX (3)
- HTML5 (1)
- EJB (1)
- osworkflow (2)
- Java face (5)
- spring (4)
- ICE (1)
- webService (2)
- MongoDB (1)
- JavaThread (4)
- JavaCollections (3)
- Hibernate (2)
- JavaMail (1)
- JavaBasic (1)
- Cache (1)
- https (4)
- DOM4J (1)
- JDOM (0)
- Mybatis (1)
- JUNIT (1)
- eclipse (1)
- easyMock (2)
最新评论
-
yadongliang:
...
自己认为的一些技术点 -
yadongliang:
每次看你头像都看的荷尔蒙分泌失调
WebService的两种方式SOAP和REST比较 (转) -
yadongliang:
hollo 写道一直有这种感觉,盲目的跟风,确实有一些人为了潮 ...
WebService的两种方式SOAP和REST比较 (转) -
welss:
博主,JNative怎么调用dll中的这种方法: int ...
JNative调用DLL -
Java_Antelope:
session.setAttribute和session.getAttribute(
Spring的事务,对 spring 的AOP事务有了一个新的认识,所以赶紧把今天的学习记下来,希望在今后的学习中能够起到一些作用,也能对今天的spring认识做一次总结。
1.spring 分享
Connection conn = Conn.getConnection();
conn.setAutoCommit(false);
……..
……...
conn.rollback();
conn.commit();
数据库的事务是针对 Connection 的。
接着再看一段代码:( spring 中事务的一段学习代码,这段代码是把 spring 和 hibernate 结合在一起的,增加了理解上的难度,hibernate ,就光用 jdbc 来进行数据库事务,但是没有其他好的代码,就这样吧)
public Long addLineItem(Long orderId, LineItem lineItem){
log("OrderListDAOHibernate.addLineItem : Start...");
OrderList orderList = (OrderList) getHibernateTemplate().load(OrderList.class, orderId);
lineItem.setOrderList(orderList);
getHibernateTemplate().saveOrUpdate(lineItem);
getHibernateTemplate().saveOrUpdate(orderList);
log("OrderListDAOHibernate.addLineItem : Ending...");
return lineItem.getId();
}
在这个代码的配置文件中,把 addLineItem 做为一个切入点,进行事务,也就是说,在 addLineItem 的外面,再包上一层事务的外壳。
但是这个时候,问题出来了,事务是针对 Connection 的,而上面的两个连续的 HibernateTemplate 执行的 saveOrUpdate 中的 Connection 必须是一致才能用事务, spring 怎么做到这一点的呢?(这个问题也就是在找 spring 的事务例子前,我想的 spring 中用 jdbc 来进行事务,怎么样让 Connection 保持一致呢?但是没有 jdbc 的例子,只有整合 hibernate 或者 ibatis 的例子,但是,我想,原理是一样的吧。)
解决问题的思路: HibernateTemplate 中的 Connection 必定一致。那么就从 HibernateTemplate 入手。
看 spring 的源代码,既然是 Hibernate ,那么,就没有 Connection 给你看,只有 Session ,由 Session 来管理 Connection ,那么用事务来控制的话,这个 Session 必定在所有该事务中是一致的。于是在 HibernateTemplate 中找到:
protected Session getSession() {
if (isAlwaysUseNewSession()) {
return SessionFactoryUtils.getNewSession(getSessionFactory(), getEntityInterceptor());
}
else if (!isAllowCreate()) {
return SessionFactoryUtils.getSession(getSessionFactory(), false);
}
else {
return SessionFactoryUtils.getSession(
getSessionFactory(), getEntityInterceptor(), getJdbcExceptionTranslator());
}
}
看来在 SessionFactoryUtils 里面,接着在 SessionFactoryUtils.getSession 中找:
这个方法太长了,太复杂了,从简,发现了非常关键的一点:
SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);
假如 sessionHolder 不等于空,说明,在事务中有这样一个还没有 commit 的 session ,那么就返回这个 session ,假如等于空,新建桓?session ,并且在事务里加入这个 session 。这段代码的意思大概是这样,太繁杂了,只能猜,也肯定是如此。
再看 getHibernateTemplate() 方法来自继承 HibernateDaoSupport ,看了电子书《 spring- reference 》的第九章“ Dao 支持”, Dao 的支持类可以有好多,如: JdbcDaoSupport , HibernateDaoSupport , JdoDaoSupport 等等。
既然前面一开始就是从 jdbc 的 spring 事务控制引起的,那么看到了同样的 HibernateDaoSupport---JdbcDaoSupport ,那么 JdbcDaoSupport 也应该有 getJdbcTemplate() 这个方法,并且返回 JdbcTemplate 这个类。
果然如此。www.51xit.com整理
于是剖析 JdbcTemplate 是不是和 HibernateTemplate 一样。果然一样。
注意到:
Connection con = DataSourceUtils.getConnection(getDataSource());
Connection 是从 DataSourceUtils.getConnection() 来的,继续跟踪 DataSourceUtils.getConnection() 。
找到:
ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
和 Hibernate 中的一模一样,因为没有了 session 的封装,条理在 jdbc 中更加清晰了。
至此, spring 的事务控制 已经全部搞定。
2.Spring 事务管理的配置
看了上面同事学习 spring 的笔记后自己也觉得有新的理解,从什么地方说起呢?就从 spring 的事务配置说起吧。那么我们看看 contextConfig.xml 吧。
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>mf/org/user/User.hbm.xml</value>
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="userManager" parent="txProxyTemplate">
<property name="target" ref="userManagerTarget" />
</bean>
<bean id="userManagerTarget"
class=" mf.org.hb.user.service.impl.UserManagerImpl">
<property name="userDAO" ref="userDAO" />
</bean>
<bean id="userDAO" class="mf.org.hb.user.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
以上就是一个完整的 spring 配置,是不是很熟悉呢,这里是用的 Appfuse 的框架,呵呵。有那么点味道吧。
首先我们看看
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
这一个 bean 让 spring 为我们注入了什么呢?事务,对!我们把 hibernate 的事务注入到了 spring 的 IOC 容器之中了。然后我们再看看:
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
这个 bean 又是让 spring 为我们注入了了什么呢?事务代理,对了!我们把事务的代理交给一个 txProxyTemplate 的去做了,这样的好处我待会再说,现在我们看看下面的一些配置信息。
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
这里就是事务处理时如果遇到异常信息,或者其他的原因时我们要求 spring 把当前的事务回滚了,这样才能不至于在数据库中产生垃圾啊。我们规定所有的 save,remove,update,incress 这样的方法开头的在出现一些问题后把事务给回滚了,看看我们写的: PROPAGATION_REQUIRED,-Exception 。
有人就会说 PROPAGATION_REQUIRED 就可以回滚事务啊,为什么加上 ,-Exception 呢?其实我以前也时这样想的,但这是不完全正确的,当然我们在处理一个事务时只要有一个 PROPAGATION_REQUIRED 就可以了,但是当我们的业务逻辑中要求我们在一个事务代理中开启两个事务,这两个事务表面上没有联系,但是实际中又有很多联系的,比如我们上传附件和提交文档,这样两个操作我们可以分开,因为他们不是往一个表里插入数据,我们又不希望这两个操作写在一个 service 里,这样我们要是有一个业务只要上传附件呢?那样我们是不是又要再写一个方法啊!所以在开启两个事务时如果有一个抛出异常了,我们就要把上一个提交的事务回滚了,这样做我们就要用的 -Exception 了,这样就完全满足我们的要求了,我也试过如果我写的是 PROPAGATION_REQUIRED,-SQLException 时,这样我们只会在出现 SQLException 时事务回顾,出现其他的异常事务就不回滚了,好在 spring 可以让我们写如异常的基类就可以做到捕获任何异常,这样我们就写 -Exception 好了。特殊情况在特殊处理吧。通用情况下我们还是这样的。
我们再看看:
<bean id="userManager" parent="txProxyTemplate">
<property name="target" ref="userManagerTarget" />
</bean>
<bean id="userManagerTarget"
class="mf.org.hb.user.service.impl.UserManagerImpl">
<property name="userDAO" ref="userDAO" />
</bean>
<bean id="userDAO" class="mf.org.hb.user.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
当然我们也可以写成:
<bean id="userManager" parent="txProxyTemplate">
<property name="target">
<bean class="mf.org.hb.user.service.impl.UserManagerImpl">
<property name="userDAO">
<ref bean="userDao"/>
</property>
</bean>
</property>
</bean>
<bean id="userDAO" class="mf.org.hb.user.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
这下我们解除以前的疑惑, parent="txProxyTemplate" 知道我们为什么在上面先写了 txProxyTemplate 的 bean 了吧,这样我们就没有必要再写一编了。是不是很方便? spring 的这些技巧还不只这些呢。这样我们就可以轻松利用以上这三个注入的类去做我们的逻辑了。
Spring 就是要我们注入实现类,然后使用接口操作,这样耦合性就不是那么强了,这也体现了 Spring 的工厂模式。而 AOP 的 manager 又象我们熟知的代理模式吧 !
3.注意要点
在写配置的时候注意各个 Manager 和 DAO 之间的关系,以及 <ref= ”” > 之间的关系,清晰里面的关系才能更好的配置
1.spring 分享
Connection conn = Conn.getConnection();
conn.setAutoCommit(false);
……..
……...
conn.rollback();
conn.commit();
数据库的事务是针对 Connection 的。
接着再看一段代码:( spring 中事务的一段学习代码,这段代码是把 spring 和 hibernate 结合在一起的,增加了理解上的难度,hibernate ,就光用 jdbc 来进行数据库事务,但是没有其他好的代码,就这样吧)
public Long addLineItem(Long orderId, LineItem lineItem){
log("OrderListDAOHibernate.addLineItem : Start...");
OrderList orderList = (OrderList) getHibernateTemplate().load(OrderList.class, orderId);
lineItem.setOrderList(orderList);
getHibernateTemplate().saveOrUpdate(lineItem);
getHibernateTemplate().saveOrUpdate(orderList);
log("OrderListDAOHibernate.addLineItem : Ending...");
return lineItem.getId();
}
在这个代码的配置文件中,把 addLineItem 做为一个切入点,进行事务,也就是说,在 addLineItem 的外面,再包上一层事务的外壳。
但是这个时候,问题出来了,事务是针对 Connection 的,而上面的两个连续的 HibernateTemplate 执行的 saveOrUpdate 中的 Connection 必须是一致才能用事务, spring 怎么做到这一点的呢?(这个问题也就是在找 spring 的事务例子前,我想的 spring 中用 jdbc 来进行事务,怎么样让 Connection 保持一致呢?但是没有 jdbc 的例子,只有整合 hibernate 或者 ibatis 的例子,但是,我想,原理是一样的吧。)
解决问题的思路: HibernateTemplate 中的 Connection 必定一致。那么就从 HibernateTemplate 入手。
看 spring 的源代码,既然是 Hibernate ,那么,就没有 Connection 给你看,只有 Session ,由 Session 来管理 Connection ,那么用事务来控制的话,这个 Session 必定在所有该事务中是一致的。于是在 HibernateTemplate 中找到:
protected Session getSession() {
if (isAlwaysUseNewSession()) {
return SessionFactoryUtils.getNewSession(getSessionFactory(), getEntityInterceptor());
}
else if (!isAllowCreate()) {
return SessionFactoryUtils.getSession(getSessionFactory(), false);
}
else {
return SessionFactoryUtils.getSession(
getSessionFactory(), getEntityInterceptor(), getJdbcExceptionTranslator());
}
}
看来在 SessionFactoryUtils 里面,接着在 SessionFactoryUtils.getSession 中找:
这个方法太长了,太复杂了,从简,发现了非常关键的一点:
SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);
假如 sessionHolder 不等于空,说明,在事务中有这样一个还没有 commit 的 session ,那么就返回这个 session ,假如等于空,新建桓?session ,并且在事务里加入这个 session 。这段代码的意思大概是这样,太繁杂了,只能猜,也肯定是如此。
再看 getHibernateTemplate() 方法来自继承 HibernateDaoSupport ,看了电子书《 spring- reference 》的第九章“ Dao 支持”, Dao 的支持类可以有好多,如: JdbcDaoSupport , HibernateDaoSupport , JdoDaoSupport 等等。
既然前面一开始就是从 jdbc 的 spring 事务控制引起的,那么看到了同样的 HibernateDaoSupport---JdbcDaoSupport ,那么 JdbcDaoSupport 也应该有 getJdbcTemplate() 这个方法,并且返回 JdbcTemplate 这个类。
果然如此。www.51xit.com整理
于是剖析 JdbcTemplate 是不是和 HibernateTemplate 一样。果然一样。
注意到:
Connection con = DataSourceUtils.getConnection(getDataSource());
Connection 是从 DataSourceUtils.getConnection() 来的,继续跟踪 DataSourceUtils.getConnection() 。
找到:
ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
和 Hibernate 中的一模一样,因为没有了 session 的封装,条理在 jdbc 中更加清晰了。
至此, spring 的事务控制 已经全部搞定。
2.Spring 事务管理的配置
看了上面同事学习 spring 的笔记后自己也觉得有新的理解,从什么地方说起呢?就从 spring 的事务配置说起吧。那么我们看看 contextConfig.xml 吧。
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>mf/org/user/User.hbm.xml</value>
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="userManager" parent="txProxyTemplate">
<property name="target" ref="userManagerTarget" />
</bean>
<bean id="userManagerTarget"
class=" mf.org.hb.user.service.impl.UserManagerImpl">
<property name="userDAO" ref="userDAO" />
</bean>
<bean id="userDAO" class="mf.org.hb.user.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
以上就是一个完整的 spring 配置,是不是很熟悉呢,这里是用的 Appfuse 的框架,呵呵。有那么点味道吧。
首先我们看看
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
这一个 bean 让 spring 为我们注入了什么呢?事务,对!我们把 hibernate 的事务注入到了 spring 的 IOC 容器之中了。然后我们再看看:
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
这个 bean 又是让 spring 为我们注入了了什么呢?事务代理,对了!我们把事务的代理交给一个 txProxyTemplate 的去做了,这样的好处我待会再说,现在我们看看下面的一些配置信息。
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
这里就是事务处理时如果遇到异常信息,或者其他的原因时我们要求 spring 把当前的事务回滚了,这样才能不至于在数据库中产生垃圾啊。我们规定所有的 save,remove,update,incress 这样的方法开头的在出现一些问题后把事务给回滚了,看看我们写的: PROPAGATION_REQUIRED,-Exception 。
有人就会说 PROPAGATION_REQUIRED 就可以回滚事务啊,为什么加上 ,-Exception 呢?其实我以前也时这样想的,但这是不完全正确的,当然我们在处理一个事务时只要有一个 PROPAGATION_REQUIRED 就可以了,但是当我们的业务逻辑中要求我们在一个事务代理中开启两个事务,这两个事务表面上没有联系,但是实际中又有很多联系的,比如我们上传附件和提交文档,这样两个操作我们可以分开,因为他们不是往一个表里插入数据,我们又不希望这两个操作写在一个 service 里,这样我们要是有一个业务只要上传附件呢?那样我们是不是又要再写一个方法啊!所以在开启两个事务时如果有一个抛出异常了,我们就要把上一个提交的事务回滚了,这样做我们就要用的 -Exception 了,这样就完全满足我们的要求了,我也试过如果我写的是 PROPAGATION_REQUIRED,-SQLException 时,这样我们只会在出现 SQLException 时事务回顾,出现其他的异常事务就不回滚了,好在 spring 可以让我们写如异常的基类就可以做到捕获任何异常,这样我们就写 -Exception 好了。特殊情况在特殊处理吧。通用情况下我们还是这样的。
我们再看看:
<bean id="userManager" parent="txProxyTemplate">
<property name="target" ref="userManagerTarget" />
</bean>
<bean id="userManagerTarget"
class="mf.org.hb.user.service.impl.UserManagerImpl">
<property name="userDAO" ref="userDAO" />
</bean>
<bean id="userDAO" class="mf.org.hb.user.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
当然我们也可以写成:
<bean id="userManager" parent="txProxyTemplate">
<property name="target">
<bean class="mf.org.hb.user.service.impl.UserManagerImpl">
<property name="userDAO">
<ref bean="userDao"/>
</property>
</bean>
</property>
</bean>
<bean id="userDAO" class="mf.org.hb.user.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
这下我们解除以前的疑惑, parent="txProxyTemplate" 知道我们为什么在上面先写了 txProxyTemplate 的 bean 了吧,这样我们就没有必要再写一编了。是不是很方便? spring 的这些技巧还不只这些呢。这样我们就可以轻松利用以上这三个注入的类去做我们的逻辑了。
Spring 就是要我们注入实现类,然后使用接口操作,这样耦合性就不是那么强了,这也体现了 Spring 的工厂模式。而 AOP 的 manager 又象我们熟知的代理模式吧 !
3.注意要点
在写配置的时候注意各个 Manager 和 DAO 之间的关系,以及 <ref= ”” > 之间的关系,清晰里面的关系才能更好的配置
发表评论
-
Struts2 修改页面
2011-12-26 23:25 12791.1、struts2代码: Bean bean=this. ... -
SSH中的Spring事务代理的常用的两种方法
2011-08-25 18:29 1414这个配置文件是我做SSH的时候用的片断,用Spring来管 ... -
Spring 事务代理配置
2011-08-25 16:56 1708让Spring架构减化事务配置 注:原创文章,本文曾发表于i ... -
S2SH 配置文件
2011-08-05 21:21 1214struts.xml源码: <?xml ver ... -
Java文单缩略内容截取
2011-07-06 13:45 1193今天一个朋友问我如何截取文章内容中的指定长度内容,多余了就加省 ... -
struts2 简单工程
2011-03-28 18:03 833struts2 简单工程 struts2 简单工程 strut ... -
Hibernate 增删改查
2011-03-27 18:00 1834package com.abin.ssh.bean; ... -
Struts2.0 Spring2.5 hibernate3.3 整合
2011-03-27 10:10 1768基本没有错误,就是报个异常如下: 09:45:13,3 ... -
struts2 Spring2.5 Hibernate3.3
2011-03-25 23:32 859struts 2 配置成功。 -
SSH2 JAR包的用法
2011-03-24 22:47 938... -
ssh jar包配置
2011-03-24 21:50 1360ssh jar包配置 www.firnow.com ... -
1000个网页小图标
2010-12-19 14:08 14311000个网页小图标 -
SSH常见问题整理
2010-12-13 10:32 920Hibernate工作原理及 ... -
ssh 底层封装(增,删,改,查,分页)
2010-12-13 09:59 1446public class QueryResult<T&g ... -
struts 学习笔记之MVC模式(附 :PO/POJO/BO/DTO/VO的区别 )
2010-12-13 09:12 1548struts 中的MVC架构如下: View :由JSP、St ... -
Spring中常用的hql查询方法(getHibernateTemplate())
2010-12-13 08:49 974Spring中常用的hql查询方法(getHibernateT ... -
getHibernateTemplate()
2010-12-13 08:41 1109HibernateTemplate提供非常多的常用方法来完成基 ...
相关推荐
内容概要:本文档《ccnp_300-430.pdf》涵盖了与Cisco无线网络配置相关的多个选择题及其答案解析。文档详细探讨了FlexConnect AP在不同模式下的行为、AP模式和子模式的选择、客户端特征配置、图像传输优化、Cisco OEAP配置、QoS设置、多播配置、安全措施(如入侵保护、恶意AP检测)、位置服务配置以及BYOD策略实施等内容。文档不仅提供了具体的配置命令和选项,还解释了每种配置背后的逻辑和技术原理。 适合人群:具备一定网络基础知识,特别是对Cisco无线网络设备有一定了解的技术人员,包括但不限于网络管理员、无线网络工程师和CCNP认证考生。 使用场景及目标: ① 为无线网络工程师提供实际操作指导,确保在不同场景下正确配置Cisco无线设备; ② 帮助CCNP认证考生复习并掌握相关知识点; ③ 协助IT管理员解决日常无线网络管理中的常见问题,如连接不稳定、性能不佳或安全性问题; ④ 支持企业IT部门制定和实施BYOD策略,确保员工个人设备接入公司网络的安全性和效率。 阅读建议:由于文档内容较为专业且技术性强,建议读者首先熟悉Cisco无线网络的基本概念和术语。在阅读过程中,应结合具体的工作环境和需求进行理解,并尝试将所学知识应用到实际工作中。对于不熟悉的术语或配置命令,可以通过查阅官方文档或在线资源进一步学习。此外,通过模拟环境练习配置也是巩固知识的有效方法。
内容概要:本文探讨了电力系统频率稳定性问题,特别是在风电大规模接入背景下,传统火电和水电调频方法面临的挑战及其解决方案。文中通过构建IEEE9节点系统模型,利用Simulink和Python进行仿真,比较了单一火电调频与风火联合调频的效果。研究表明,引入虚拟惯性控制和下垂控制可以显著提高系统的响应速度和稳定性,同时指出水电调频中存在的水锤效应对频率稳定的影响及相应的抑制措施。 适合人群:从事电力系统研究的专业人士、高校相关专业师生以及对电力系统调频感兴趣的工程技术人员。 使用场景及目标:适用于希望深入了解电力系统调频机制的研究人员和技术人员,旨在帮助他们掌握最新的调频技术和理论,提升实际工作中解决问题的能力。 其他说明:文章不仅提供了详细的数学模型和仿真代码,还分享了一些实用的小技巧,如参数优化方法和仿真加速策略,有助于读者更好地理解和应用所介绍的技术。
内容概要:本文详细介绍了如何在COMSOL中进行热湿耦合仿真,特别是针对蒸汽在顶部冷凝的复杂场景。首先搭建了一个20cm高的多孔介质层模型,设置了必要的物理场(如热湿传递和层流),并讨论了材料参数的选择,特别是蒸汽扩散系数和孔隙度的变化。接着深入探讨了边界条件的设置方法,包括蒸汽入口的速度和温度控制,以及冷凝边界的处理方式。文中还强调了求解器设置的重要性,提出了稳态解和瞬态解相结合的方法,并给出了具体的网格划分技巧。最后,文章提供了关于冷凝水量计算和表面张力处理的实用建议,确保仿真结果更加接近实际情况。 适合人群:具有一定COMSOL使用经验的研究人员和技术人员,特别是从事热湿耦合仿真领域的专业人士。 使用场景及目标:适用于需要精确模拟蒸汽冷凝过程的实际工程项目,如工业设备设计、建筑环境控制等。目标是帮助用户掌握COMSOL中热湿耦合仿真的关键技术,提高仿真精度和可靠性。 其他说明:文中提供的代码片段和具体参数设置对于初学者来说非常有价值,能够快速上手并应用于实际工作中。此外,文章还分享了一些常见的错误及其解决方法,有助于避免仿真过程中常见的陷阱。
# 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
内容概要:本文详细介绍了基于西门子S7-200smart PLC和西门子触摸屏构建的恒压供水(无负压供水)系统。系统通过PLC对电机进行智能控制,确保水压稳定。主要功能包括一拖二自动控制、PID调节实现恒压控制以及友好的人机交互界面。文中还展示了详细的PLC控制代码和PID控制算法,并讨论了电气图纸的设计要点和实际工程中的注意事项。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是熟悉PLC编程和恒压供水系统设计的专业人士。 使用场景及目标:适用于需要稳定供水的工业生产和居民生活场景,旨在提高供水系统的可靠性和稳定性,减少设备磨损和能源浪费。 其他说明:文章不仅提供了完整的系统设计方案,还包括了许多实际调试经验和常见问题的解决方法,有助于读者更好地理解和实施该系统。
# 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
内容概要:本文详细介绍了滑模观测器和PLL在STM32F1平台上的C代码实现。滑模观测器用于估计系统内部状态,尤其适用于电机控制领域;PLL则用于确保输出信号相位与输入信号相位保持一致。文中展示了两种滑模观测器的实现方法:一种采用符号函数进行硬切换,另一种采用饱和函数进行软化处理。此外,文章还强调了使用TI的IQmath库进行定点计算加速,以提高运算效率并减少资源占用。通过具体的代码示例和调试技巧,作者分享了如何在STM32F1平台上实现高效稳定的滑模观测器和PLL系统。 适合人群:嵌入式系统开发者、电机控制系统工程师、熟悉C语言编程的技术人员。 使用场景及目标:① 实现高效的滑模观测器和PLL系统,应用于电机控制和其他实时性要求较高的场景;② 学习如何使用IQmath库进行定点计算加速,优化嵌入式系统的性能;③ 掌握调试技巧,确保系统稳定运行。 其他说明:文章提供了详细的代码示例和调试经验,帮助读者更好地理解和实现滑模观测器和PLL系统。同时,文中提到的一些注意事项和常见问题解决方案也非常实用。
# 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
内容概要:本文详细介绍了如何利用C语言在Simulink环境中构建逆变器的重复控制系统,旨在将逆变器的总谐波畸变率(THD)降低至0.47%。文中首先展示了核心的C语言结构体和函数,如RepetitiveController结构体用于封装延迟存储器、零相位滤波器和低通滤波器,repetitive_control函数则实现了核心算法。接着,文章解释了离散化处理的方法,包括主电路和控制部分的不同步长运行机制,以及多速率仿真的应用。此外,还讨论了陷波器的具体实现及其参数调整,强调了双线性变换在滤波器设计中的重要性。最后,文章提到了代码的高效移植性,指出通过这种方式可以在仿真阶段就为后续的实际硬件部署做好准备,大大减少了调试时间和复杂度。 适合人群:从事电力电子领域的工程师和技术人员,尤其是对逆变器控制和信号处理有一定了解的人群。 使用场景及目标:适用于需要精确控制逆变器输出质量的应用场合,如光伏逆变器、UPS电源等。主要目标是通过高效的算法设计和优化,确保逆变器输出的THD达到极低水平,同时提高代码的可移植性和易维护性。 其他说明:本文不仅提供了详细的理论背景和技术细节,还分享了许多实践经验,如环形缓冲区的使用、陷波器的参数选择等,对于理解和实施逆变器控制具有很高的参考价值。
Outlook新邮件到达时不显示通知
内容概要:本文详细介绍了三相维也纳PFC开关电源的设计、调试经验和量产方案。主要内容涵盖三相AC输入、无桥PFC结构、±400V DC输出的特点及其优势。文中提供了关键代码片段,如PFC开关频率控制、PWM初始化、过流保护等,并深入探讨了原理图设计、PCB布局要点以及EMI滤波措施。此外,还涉及移相全桥和LLC方案的应用,特别是在高效率、高功率密度场合的表现。作者分享了大量实战经验,包括硬件选型、软件调试技巧和常见问题解决方法。 适合人群:从事电力电子、工业电源设计的技术人员,尤其是对三相PFC、移相全桥和LLC技术感兴趣的工程师。 使用场景及目标:帮助读者理解和掌握三相维也纳PFC的工作原理和技术细节,提供实用的调试经验和量产解决方案,适用于新能源充电桩、大功率服务器电源等领域的产品开发。 其他说明:文章不仅涵盖了理论知识,还包括大量的实战案例和代码示例,有助于读者在实践中快速上手并解决问题。
黑板卡通熊儿童教学教案课件模板
内容概要:本文详细介绍了如何利用Python编程语言进行沟槽开挖土方量的计算,采用断面法作为主要手段。首先定义了基本参数如原地面标高、设计沟底标高等,接着通过函数calculate_section_area实现了断面面积的计算,考虑了边坡系数的影响。然后,通过遍历多个断面并应用平均面积法或棱台公式求解总土方量。此外,还探讨了如何使用matplotlib库绘制断面图以及处理复杂地形的方法,如使用pandas处理Excel数据和geopandas进行空间分析。文中强调了实际工程项目中需要注意的问题,如断面间距的选择、不同地质层的分段计算等。 适合人群:从事土木工程、市政建设等领域的一线工程师和技术人员,尤其是那些希望提高工作效率、减少手工计算错误的人群。 使用场景及目标:适用于需要精确计算沟槽开挖土方量的实际工程项目中,帮助工程师们更好地规划施工进度、控制成本。同时,也为后续的设计调整提供了科学依据。 其他说明:本文不仅提供了具体的Python代码实现,还分享了许多实践经验,如避免常见的计算陷阱、确保数据精度等。对于想要深入理解土方量计算原理及其自动化实现的人来说,是一份非常有价值的参考资料。
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
内容概要:本文详细介绍了如何利用Matlab实现MLP(多层感知机)进行时间序列预测。首先,通过对一维时间序列数据进行预处理,包括加载、划分训练集和测试集以及标准化。接着,构建了一个带有单隐藏层的MLP模型,并设置了训练参数,如隐藏层神经元个数、学习率和最大迭代次数。随后,使用训练好的模型对测试数据进行了预测,并通过R²和MAE两个指标评估了模型的性能。最后,提供了完整的代码实现和一些优化建议,如调整验证集比例和加入置信区间可视化。 适合人群:具有一定编程基础,尤其是熟悉Matlab和机器学习基础知识的研究人员和技术爱好者。 使用场景及目标:适用于需要进行时间序列预测的场景,如金融市场的趋势分析、气象预报等。目标是帮助读者掌握MLP在时间序列预测中的具体实现方法,理解各个步骤的作用,并能够根据自己的数据集进行相应的调整和优化。 其他说明:文中还提到了一些实用的小技巧,例如如何避免常见错误(如数据格式问题)、选择合适的隐藏层神经元数量以及如何正确地进行数据标准化等。此外,强调了在实际应用中可以通过调整模型参数来提高预测精度。
修改PDF元属性作者信息
踏入智慧校园的新时代,一场科技与教育的深度融合正在悄然上演。本方案以大数据、云计算、AI等前沿技术为基石,为校园管理带来前所未有的变革与便捷。 一、一键智控,校园管理轻松升级 想象一下,只需轻点手机,就能实现校园的全面智控。从教学教务到行政后勤,从师生考勤到校园安全,智慧校园解决方案一网打尽。通过构建统一的数据中台,实现各系统间的无缝对接与数据共享,让繁琐的管理工作变得轻松高效。智能排课、自动考勤、在线审批……一系列智能应用让校园管理如虎添翼,让校长和老师们从繁琐的事务中解放出来,专注于教学创新与质量提升。 二、寓教于乐,学习生活趣味无穷 智慧校园不仅让管理变得更简单,更让学习生活变得趣味无穷。AI赋能的教学系统能根据学生的学习习惯和能力,提供个性化的学习路径与资源推荐,让学习变得更加高效有趣。同时,丰富的课外活动与社团管理模块,让孩子们的课余生活也充满了欢声笑语。从智慧班牌到智能录播,从家校共育到虚拟实验室,智慧校园让每一个角落都充满了探索的乐趣与知识的光芒。 三、安全守护,校园生活无忧无虑 在智慧校园的守护下,校园生活变得更加安全无忧。通过高清视频监控、智能预警系统与人脸识别技术,校园安全得到了全方位保障。无论是外来人员的入侵还是学生的异常行为,都能被及时发现并处理。同时,智能化的健康管理系统还能实时监测师生的健康状况,为校园防疫工作提供有力支持。智慧校园,用科技的力量为每一位师生筑起了一道坚实的安全防线,让校园生活更加安心、舒心。
内容概要:本文详细介绍了锂电池二阶RC等效电路模型的构建与仿真方法。首先解释了选择二阶RC模型的原因,即它能够平衡复杂性和准确性,有效描述锂电池在充放电过程中的动态特性。接着展示了该模型的具体结构,包括开路电压源、欧姆内阻及两个RC支路。然后通过Python代码演示了如何实现模型的仿真,利用numpy和matplotlib库完成参数设置、模型仿真和结果可视化。此外,还讨论了参数辨识的方法,如最小二乘拟合,并强调了模型验证的重要性。最后指出该模型可用于电池管理系统(BMS)中,帮助实时监测和预测电池状态。 适合人群:从事锂电池研究、电池管理系统开发的技术人员,以及对电池建模感兴趣的科研工作者。 使用场景及目标:适用于需要理解和预测锂电池动态特性的场合,如电动车、储能系统等领域。目标是提高对锂电池行为的理解,优化电池管理系统的性能。 其他说明:文中提供了详细的代码示例,便于读者动手实践。同时提醒读者注意模型参数随温度变化的情况,建议在不同温度条件下进行参数标定。
内容概要:本文详细介绍了使用C#开发工业控制系统的上位机应用,涵盖主控界面设计、PLC通讯协议实现以及工艺编辑界面的构建。首先讨论了主控界面的设计,推荐使用WinForms或WPF进行布局,强调了SplitContainer和DockPanel等控件的应用。接着深入探讨了PLC通讯部分,提出了采用工厂模式抽象不同类型的PLC驱动(如Modbus TCP和RTU),并提供了具体的代码示例。对于工艺编辑界面,则提倡使用PropertyGrid控件结合自定义对象,避免使用Excel,同时介绍了如何利用OxyPlot库实现高效的曲线绘制和交互操作。此外,文中还特别提到了线程安全性和UI更新的最佳实践,确保系统的稳定运行。 适合人群:具有一定C#编程经验和对工业自动化感兴趣的开发者,尤其是从事上位机控制系统开发的技术人员。 使用场景及目标:适用于需要开发高效稳定的工业控制上位机系统的场合,帮助开发者掌握从界面设计到通讯协议实现再到数据展示的一系列关键技术,最终实现一个功能完备、易于维护的上位机应用程序。 其他说明:文中不仅提供了详细的代码片段和技术细节,还分享了许多实际项目中的宝贵经验,如避免常见错误、优化性能等方面的内容。