如何把一个包含List的bean插入到数据库中?

图片说明

这是一个Bean List里的数据我已经从页面接到,如何把这个集合直接插入到数据库中

这三个List里面装的都是字符串

5个回答

数据库中没有List类型,想要将List中的字符串数据保存到数据库,可以用别的方式来解决:

1、将List中的数据拼接成按特殊字符(如“;”)分隔的字符串,然后存入数据库;
2、将List对应的数据存放到其它表中,它们之间通过id进行关联。

不管是那种情况,都需要在代码中进行处理的。

这个逻辑需要你自己处理,是循环插入还是组合到一起,你自己决定,框架是不会负责的

具体看你hibernate的配置和表了。如果你那几个List 在hibernate都是一对多的配置的话,是不在你这个对象进行控制的。你这个对象保存到数据库
中只会插入 id, resultthreadid对象的id

看你的hibernate是怎么配置的

要看你这个List的属性跟数据库的表的字段是怎么映射的呢?根据你的业务需求进行存储就好了啊。
如果理不清楚,说明你的数据结构设计有问题。先设计好数据库的结构,再设计java bean,二者的映射关系要弄清楚才好。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Android GreenDao一对多插入数据后查询不到列表数据
Android GreenDao一对多插入数据后查询到类的列表数据为空,但是我查数据库里面数据是插入进去了的,求大神解决 就是一个类里面有一个list集合,但是get的时候取不出来List<Bean> 集合 我按照上面的写了1对n,但是get的时候取不出来List<Bean> 集合 @Entity public class UserBean { @ID(autoincrement = true) private Long id; @notnull private String name; private int age; private String province; private boolean isMale; private String idCard; private Long otherUserInfoId; @ToMany(referencedJoinProperty = "otherUserInfoId") private List<OtherUserInfoBean> otherUserInfoBeans; } @Entity public class OtherUserInfoBean { @ID(autoincrement = true) private Long id; private Long otherUserInfoId; private String address; private String tel; private Date birthday; }
hibernate 不用事务,也提交到了数据库,帮忙看看
<div class="iteye-blog-content-contain" style="font-size: 14px;"> <p>配置 spring mvc + hibernate , 我在配置文件配置了注解的事务,但是<span style="color: #ff0000;">controller 没写上@transaction 数据竟然插入到了数据库, 我都把事务的配置文件给干掉了也是提交到了数据库</span>, 看了半天找不到, 帮忙看看,谢谢! 用的是sql server 数据库</p> <p> </p> <pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"&gt; &lt;context-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt;WEB-INF/spring/spring.xml&lt;/param-value&gt; &lt;/context-param&gt; &lt;!-- 配置DispatcherServlet--&gt; &lt;servlet&gt; &lt;servlet-name&gt;springMVC&lt;/servlet-name&gt; &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt; &lt;init-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt;WEB-INF/spring/springMVC.xml&lt;/param-value&gt; &lt;/init-param&gt; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;springMVC&lt;/servlet-name&gt; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; &lt;!-- 监听器 --&gt; &lt;listener&gt; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt; &lt;/listener&gt; &lt;!-- 编码过滤器 --&gt; &lt;filter&gt; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt; &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt; &lt;init-param&gt; &lt;param-name&gt;encoding&lt;/param-name&gt; &lt;param-value&gt;UTF-8&lt;/param-value&gt; &lt;/init-param&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt; &lt;/filter-mapping&gt; &lt;!-- security --&gt; &lt;filter&gt; &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt; &lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;/filter-mapping&gt; &lt;welcome-file-list&gt; &lt;welcome-file&gt;index.do&lt;/welcome-file&gt; &lt;/welcome-file-list&gt; &lt;/web-app&gt;</pre> <p> </p> <pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"&gt; &lt;context:annotation-config /&gt; &lt;!-- 自动扫描的包名 --&gt; &lt;context:component-scan base-package="com.belief.web.controller.**"&gt;&lt;/context:component-scan&gt; &lt;bean id="springContextUtil" class="com.belief.web.common.util.SpringContextUtil" &gt;&lt;/bean&gt; &lt;bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"&gt; &lt;property name="basename"&gt; &lt;value&gt;/WEB-INF/message/message&lt;/value&gt; &lt;/property&gt; &lt;property name="cacheSeconds"&gt; &lt;value&gt;-1&lt;/value&gt; &lt;/property&gt; &lt;property name="defaultEncoding"&gt; &lt;value&gt;UTF-8&lt;/value&gt; &lt;/property&gt; &lt;/bean&gt; &lt;!-- 默认的注解 --&gt; &lt;!-- &lt;mvc:annotation-driven/&gt; --&gt; &lt;bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"&gt; &lt;!-- &lt;property name="interceptors"&gt; &lt;list&gt; &lt;bean class="com.belief.web.common.MyIntercepter"&gt;&lt;/bean&gt; 国际化拦截器配置 &lt;bean id="localResolver" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"&gt;&lt;/bean&gt; &lt;/list&gt; &lt;/property&gt; --&gt; &lt;/bean&gt; &lt;!-- 手动注册注解 --&gt; &lt;bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&gt; &lt;property name="messageConverters"&gt; &lt;list&gt; &lt;ref bean="byteArray_hmc" /&gt; &lt;ref bean="string_hmc" /&gt; &lt;ref bean="resource_hmc" /&gt; &lt;ref bean="source_hmc" /&gt; &lt;ref bean="xmlAware_hmc" /&gt; &lt;ref bean="jaxb2Root-hmc" /&gt; &lt;ref bean="jackson_hmc" /&gt; &lt;/list&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id="byteArray_hmc" class="org.springframework.http.converter.ByteArrayHttpMessageConverter"&gt;&lt;/bean&gt; &lt;bean id="string_hmc" class="org.springframework.http.converter.StringHttpMessageConverter"&gt; &lt;property name ="supportedMediaTypes"&gt; &lt;list&gt;&lt;value&gt;text/plain;charset=UTF-8&lt;/value&gt;&lt;/list&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id="resource_hmc" class="org.springframework.http.converter.ResourceHttpMessageConverter"&gt;&lt;/bean&gt; &lt;bean id="source_hmc" class="org.springframework.http.converter.xml.SourceHttpMessageConverter"&gt;&lt;/bean&gt; &lt;bean id="xmlAware_hmc" class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"&gt;&lt;/bean&gt; &lt;bean id="jaxb2Root-hmc" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"&gt;&lt;/bean&gt; &lt;bean id="jackson_hmc" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"&gt;&lt;/bean&gt; &lt;!-- 试图解析 --&gt; &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/pages/" &gt; &lt;!-- &lt;property name="prefix" value="/WEB-INF/pages/"&gt;&lt;/property&gt; &lt;property name="suffix" value=""&gt;&lt;/property&gt; --&gt; &lt;property name="viewClass" value="org.springframework.web.servlet.view.JstlView"&gt;&lt;/property&gt; &lt;/bean&gt; &lt;bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"&gt; &lt;property name="cookieName" value="clientlanguage"/&gt; &lt;property name="cookieMaxAge"&gt; &lt;value&gt;2592000&lt;/value&gt; &lt;/property&gt; &lt;/bean&gt; &lt;!-- 拦截器 --&gt; &lt;mvc:interceptors&gt; &lt;bean class="com.belief.web.common.intercepter.MyIntercepter"&gt;&lt;/bean&gt; &lt;!-- 国际化拦截器配置 --&gt; &lt;bean id="localResolver" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"&gt;&lt;/bean&gt; &lt;!-- 单独URL配置拦截器 --&gt; &lt;!-- &lt;mvc:interceptor&gt; &lt;mvc:mapping path="/user/*" /&gt; &lt;bean class="com.belief.web.common.MyIntercepter"&gt;&lt;/bean&gt; &lt;/mvc:interceptor&gt; --&gt; &lt;/mvc:interceptors&gt; &lt;!-- 静态资源文件的访问,方案一 --&gt; &lt;mvc:default-servlet-handler/&gt; &lt;!-- 静态资源文件的访问,方案二 cache-period 可以使得静态资源进行web cache --&gt; &lt;!-- &lt;mvc:resources location="/images/" mapping="/images/**" cache-period="31556926" /&gt; &lt;mvc:resources location="/js/" mapping="/js/**"/&gt; &lt;mvc:resources location="/css/" mapping="/css/**"/&gt; --&gt; &lt;!-- 全局异常处理 --&gt; &lt;bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"&gt; &lt;property name="defaultErrorView"&gt; &lt;value&gt;/error/exception.jsp&lt;/value&gt; &lt;/property&gt; &lt;!-- 值:“org.springframework.web.servlet.handler.SimpleMappingExceptionResolver”,是“SimpleMappingExceptionResolver类的全限定名”。 这个值不是随便写的。 因为我在log4j的配置文件中还要加入 log4j.logger.org.springframework.web.servlet.handler.SimpleMappingExceptionResolver=WARN, 保证这个级别是warn的日志一定会被记录,即使log4j的根日志级别是ERROR。 --&gt; &lt;property name="warnLogCategory"&gt; &lt;value&gt;org.springframework.web.servlet.handler.SimpleMappingExceptionResolver&lt;/value&gt; &lt;/property&gt; &lt;property name="exceptionMappings"&gt; &lt;props&gt; &lt;prop key="java.lang.IllegalArgumentException"&gt;/error/exception.jsp&lt;/prop&gt; &lt;/props&gt; &lt;/property&gt; &lt;/bean&gt; &lt;/beans&gt;</pre> <p> </p> <pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans default-autowire="byName" xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"&gt; &lt;bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource" depends-on="propertyConfigurer"&gt; &lt;property name="driver" value="${jdbc.driverClassName}"&gt;&lt;/property&gt; &lt;property name="driverUrl" value="${jdbc.url}"&gt;&lt;/property&gt; &lt;property name="user" value="${jdbc.username}"&gt;&lt;/property&gt; &lt;property name="password" value="${jdbc.password}"&gt;&lt;/property&gt; &lt;!-- 最大连接数(默认5个) --&gt; &lt;property name="maximumConnectionCount"&gt; &lt;value&gt;60&lt;/value&gt; &lt;/property&gt; &lt;!-- 最小连接数(默认2个) --&gt; &lt;property name="minimumConnectionCount"&gt; &lt;value&gt;10&lt;/value&gt; &lt;/property&gt; &lt;!-- 同时构建节流 --&gt; &lt;property name="simultaneousBuildThrottle"&gt; &lt;value&gt;10000&lt;/value&gt; &lt;/property&gt; &lt;!-- 最少保持的空闲连接数(默认2个) --&gt; &lt;property name="prototypeCount"&gt; &lt;value&gt;5&lt;/value&gt; &lt;/property&gt; &lt;!-- 使用前测试 --&gt; &lt;property name="testBeforeUse"&gt; &lt;value&gt;true&lt;/value&gt; &lt;/property&gt; &lt;!-- 测试使用的sql --&gt; &lt;property name="houseKeepingTestSql"&gt; &lt;value&gt;select getDate()&lt;/value&gt; &lt;/property&gt; &lt;!-- 最大活动时间(超过此时间线程将被kill,默认5分钟) --&gt; &lt;property name="maximumActiveTime"&gt; &lt;value&gt;7200000&lt;/value&gt; &lt;/property&gt; &lt;!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒) --&gt; &lt;!-- &lt;property name="houseKeepingSleepTime" value="${proxool.hourseKeepingSleepTime}"/&gt; --&gt; &lt;/bean&gt; &lt;!-- 可以在XML配置文件中加入外部属性文件 --&gt; &lt;bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt; &lt;property name="location"&gt; &lt;value&gt;WEB-INF/config.properties&lt;/value&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" depends-on="propertyConfigurer"&gt; &lt;property name="dataSource"&gt; &lt;ref local="dataSource" /&gt; &lt;/property&gt; &lt;property name="mappingResources"&gt; &lt;list&gt; &lt;value&gt;com/belief/web/biz/user/User.hbm.xml&lt;/value&gt; &lt;/list&gt; &lt;/property&gt; &lt;property name="hibernateProperties"&gt; &lt;props&gt; &lt;!-- Oracle --&gt; &lt;!-- &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.OracleDialect&lt;/prop&gt; --&gt; &lt;!-- Sql Server --&gt; &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.SQLServerDialect&lt;/prop&gt; &lt;prop key="hibernate.cglib.use_reflection_optimizer"&gt;true&lt;/prop&gt; &lt;prop key="hibernate.show_sql"&gt;${hibernate.show_sql}&lt;/prop&gt; &lt;prop key="hibernate.query.substitutions"&gt;true 1, false 0&lt;/prop&gt; &lt;!-- 开启二级缓存 --&gt; &lt;!-- &lt;prop key="hibernate.cache.use_second_level_cache"&gt;true&lt;/prop&gt; --&gt; &lt;!-- 设置缓存类 --&gt; &lt;!-- &lt;prop key="hibernate.cache.provider_class"&gt;org.hibernate.cache.EhCacheProvider&lt;/prop&gt; --&gt; &lt;!-- 否使用结构化的方式缓存对象 --&gt; &lt;!-- &lt;prop key="hibernate.cache.use_structured_entries"&gt;true&lt;/prop&gt; --&gt; &lt;!-- 是否缓存查询结果 --&gt; &lt;!-- &lt;prop key="hibernate.cache.use_query_cache"&gt;true&lt;/prop&gt; --&gt; &lt;/props&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"&gt; &lt;property name="sessionFactory"&gt;&lt;ref bean="sessionFactory"/&gt;&lt;/property&gt; &lt;/bean&gt; &lt;!-- 配置事务 --&gt; &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt; &lt;property name="sessionFactory" &gt; &lt;ref local="sessionFactory"/&gt; &lt;/property&gt; &lt;/bean&gt; &lt;!-- 注解事务 --&gt; &lt;tx:annotation-driven transaction-manager="transactionManager" /&gt; &lt;bean id="dao" class="com.belief.web.common.dao.Dao"&gt; &lt;/bean&gt; &lt;bean id="daoFactorySupport" class="com.belief.web.common.dao.DaoFactorySupport"&gt; &lt;/bean&gt; &lt;/beans&gt;</pre> <p> </p> <pre name="code" class="java">@RequestMapping(value = "/add",method = RequestMethod.POST) public String add(HttpServletRequest request,HttpServletResponse response){ Dao dao = DaoFactory.getInstance().getDao(); User user = new User(); user.setName("hibernate"); user.setState(PojoState.NORMAL); user.setVersion(1); dao.save(user); return "redirect:/index.do"; }</pre> <p> </p> <pre name="code" class="java">public class User extends BaseEntity { private static final long serialVersionUID = 2274719953051444808L; /** 员工姓名 */ private String name; /** 用户组 */ private String userGroup;</pre> <p> </p> <pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt; &lt;hibernate-mapping&gt; &lt;class name="com.belief.web.biz.user.User" table="auth_user"&gt; &lt;!-- &lt;cache usage="read-write" /&gt; --&gt; &lt;id name="id" column="user_id" unsaved-value="null"&gt; &lt;generator class="identity" /&gt; &lt;/id&gt; &lt;property name="version" column="version" /&gt; &lt;property name="createTime" column="create_time" /&gt; &lt;property name="updateTime" column="update_time" /&gt; &lt;property name="userGroup" column="user_group" /&gt; &lt;property name="penddingReadAnnonAmt" column="pendding_read_annon_amt" /&gt; &lt;many-to-one name="createUser" column="create_user" class="com.belief.web.biz.user.User" /&gt; &lt;many-to-one name="updateUser" column="update_user" class="com.belief.web.biz.user.User" /&gt; &lt;property name="state" type="com.belief.web.common.entity.PojoStateType" /&gt; &lt;property name="name" /&gt; &lt;/class&gt; &lt;/hibernate-mapping&gt;</pre> <p> </p> <pre name="code" class="java">package com.belief.web.common.dao; import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.belief.web.common.entity.BaseEntity; @SuppressWarnings("unchecked") public class Dao extends HibernateDaoSupport{ public &lt;T extends BaseEntity&gt;T get(Class&lt;? extends BaseEntity&gt; cls,String id){ return (T) this.getHibernateTemplate().get(cls, id); } public List&lt;BaseEntity&gt; find(Class&lt;? extends BaseEntity&gt; cls){ return this.getHibernateTemplate().find("FROM "+cls.getName()); } public void save(BaseEntity baseEntity){ getHibernateTemplate().save(baseEntity); } } </pre> <p> </p> <pre name="code" class="java">package com.belief.web.common.dao; public class DaoFactory { private static final DaoFactory instance = new DaoFactory(); public static DaoFactory getInstance() { return instance; } Dao dao; public Dao getDao() { return dao; } } </pre> <p> </p> <pre name="code" class="java">package com.belief.web.common.dao; public class DaoFactorySupport { public void setDao(Dao dao){ DaoFactory.getInstance().dao = dao; } } </pre> <p> </p> </div>
Hibernate 将旧记录状态置为N,然后插入新记录,但是旧记录时间也更新了
我要是实现的功能是: 一个用户会上传照片,并且可以更新; 每次更新,不删除数据库记录,只把表中的 "isAvailable"字段 状态从"Y" 改为"N",不更新时间戳字段 "initTime",然后往数据库中查入一条新纪录。 然后我出现的问题是,每次更新照片的时候,旧记录的时间戳字段 "initTime"也会被修改,而且时间比新纪录要晚20秒左右。 项目中用了spring托管Hibernate事务 application.xml配置如下: <!-- 配置session factory--> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> </bean> <!--配置事务管理器--> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!--配置拦截器--> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager"></property> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <!-- 配置bean自动代理 --> <bean id="autoproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="proxyTargetClass" value="true"/> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> <property name="beanNames"> <list> <value>*Service</value> </list> </property> </bean> service层代码(部分,去掉生成文件名,路径等跟问题无关的代码) public ServiceResult imageUploadByUserId(FileVO fileVO, UserLoginInfo loginInfo) throws BaseException { if (null == fileVO || null == loginInfo) { setServiceResult(REP_USER_PARAM_ERROR, MSG_USER_PARAM_EMPTY, null); return mServiceResult; } int userRecordId = loginInfo.getUserRecordId(); String imageType = fileVO.getFileType(); //更新原有图片记录 List<BaseModel> imagesResult = mImageInfoDAO .getImageInfoByUserIdAndType(userRecordId, imageType); if (null != imagesResult) { for (BaseModel item : imagesResult) { ((TImageInfo) item).setIsNew(IS_NEW_VALUE_NO); mImageInfoDAO.saveOrUpdateImageInfoByInstance(((TImageInfo) item)); } } //保存数据库 TImageInfo imageInfo = new TImageInfo(); imageInfo.setOwnerRecordId(userRecordId); imageInfo.setImagePath(targetFileRelativePath); imageInfo.setThumbnailPath(targetThumbnailRelativePath); imageInfo.setImageType(imageType); imageInfo.setImagePurpose(fileVO.getFilePurpose()); imageInfo.setContentType(fileVO.getFileContentType()); imageInfo.setIsNew(IS_NEW_VALUE_YES); imageInfo.setInitTime(new Timestamp(timestamp)); if (mImageInfoDAO.saveOrUpdateImageInfoByInstance(imageInfo)) { setServiceResult(REP_SERVER_HANDLE_SUCCESS, null, null); } else { setServiceResult(REP_SERVER_HANDLE_ERROR, null, null); } return mServiceResult; } Dao层查询方法 public List<BaseModel> getImageInfoByUserIdAndType(int userRecordId, String imageType) throws BaseException { try { List<BaseModel> resultList = getSession().createCriteria(TImageInfo.class) .add(Restrictions.eq(OWNER_RECORD_ID_KEY, userRecordId)) .add(Restrictions.eq(IMAGE_TYPE_KEY, imageType)) .list(); if (null == resultList || resultList.isEmpty()) { return null; } return resultList; } catch (RuntimeException re) { BaseException be = ExceptionFactory.getException(DAOException.class, "save or update Image Info RTException", re); throw be; } Dao层更新方法 public boolean saveOrUpdateImageInfoByInstance(TImageInfo imageInfo) throws BaseException { try { getSession().saveOrUpdate(imageInfo); return true; } catch (RuntimeException re) { BaseException be = ExceptionFactory.getException(DAOException.class, "save or update Image Info RTException", re); throw be; } }
整合Spring+Hibernate时,主键策略是assigned插入不进数据,也不报任何错!
在save()前打印了一下实体类,save()后也打印了一下实体类,都是有值,但是数据库里就是插入不进数据,我把Student.hbm.xml中的assigned改成native,就能插入进数据。。。 Dao层 ``` public class UserDaoImpl implements UserDao { private SessionFactory sessionFactory; @Autowired public void setSessionFactoryOverride(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public void addStudent(Student student) { System.out.println(sessionFactory); System.out.println("添加前:" + student); sessionFactory.getCurrentSession().save(student); } } ``` Student.hbm.xml ``` <hibernate-mapping> <class name="com.zlm.entity.Student" table="student"> <id name="studentId" type="java.lang.Integer" > <column name="studentId" /> <generator class="assigned" /> </id> <property name="password" type="java.lang.String"> <column name="password" /> </property> <property name="identify" type="java.lang.Integer"> <column name="identify" /> </property> </class> </hibernate-mapping> ``` 实体类就是 private int studentId; get set applicationContext.xml ``` <beans> <context:component-scan base-package="com.zlm" use-default-filters="false" /> <context:property-placeholder location="classpath:config/db.properties" /> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClass}"></property> <property name="url" value="${jdbc.jdbcUrl}"></property> <property name="username" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop> </props> </property> <property name="mappingResources"> <list> <value>com/zlm/entity/Student.hbm.xml</value> </list> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> </beans> ```
来个大神教我配置Spring的bean生命周期
bean配置默认是单例,使用autowired没问题 ``` <bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="Dao.UserDao"></property> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean> ``` 我想配置它每次请求这个bean就生成一个实例 然后就炸了 ``` <!--Dao配置--> <bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean" scope="prototype"> <property name="mapperInterface" value="Dao.UserDao"></property> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean> <!--Service配置--> <bean id="userService" class="Service.UserService" scope="prototype"> <property name="uDao" ref="userDao"></property> </bean> ``` ``` import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import Common.InitDataBases; import Common.Controller.OutputStringController; import Dao.UserDao; import Model.User; import java.util.List; import org.apache.log4j.Logger; @Controller public class Hello extends OutputStringController{ @Autowired private UserDao uDao; //数据库测试 @RequestMapping(value = "/getUser", produces = "text/html;charset=UTF-8") @ResponseBody public String dbTest(String username) { System.out.println(uDao.findByUsername(username).getUsername()); return success(""); } } ``` ``` import java.util.List; import org.apache.ibatis.annotations.Param; import Model.User; public interface UserDao { //查询 public User findById(long id); public User findByUsernameAndPassword(@Param("username")String username,@Param("password")String password); public User findByUsername(String username); public List<User> findByDepartment(long department); //插入 public int applyUser(User u); } ``` ``` 2017-04-01 13:30:56 ERROR [http-bio-8080-exec-6] org.springframework.web.servlet.DispatcherServlet - Context initialization failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'hello': Unsatisfied dependency expressed through field 'uDao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'Dao.UserDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1225) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:552) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:759) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668) at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634) at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:682) at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:553) at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494) at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) at javax.servlet.GenericServlet.init(GenericServlet.java:158) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1282) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1195) at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:866) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1082) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:623) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'Dao.UserDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1474) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1102) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1064) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ... 37 more ```
SSH开发输出少内容,发现是插入数据的问题,看看问题在哪儿?
最近学习了浪曦风中叶张老师的SSH项目,自己做的时候发现输出少内容,控制台没有报错,结果如下: List User 序号 姓名 密码 年龄 更新 删除 1 e update delete 开始把User的name属性是username的时候,姓名有输出,密码和年龄没有输出,年龄显示为0(那时候age的类型为int)。 发现先在数据库中输入数据可以得到结果,就是在jsp页面输入数据到数据库的过程中有问题,名字和年龄在数据库中均为空。 请高手看看是哪儿的问题,谢谢! 下面为主要代码: index.jsp [code="java"]<body> <s:a href="save.jsp">SaveUser</s:a><br> <s:a href="listUser.action">ListUser</s:a> </body>[/code] save.jsp(内容部分国际化) [code="java"]<s:form action="saveUser"> <s:textfield name="user.name" label="%{getText('name')}"></s:textfield> <s:textfield name="user.password" label="%{getText('password')}"></s:textfield> <s:textfield name="user.age" label="%{getText('age')}"></s:textfield> <s:submit name="submit" value="%{getText('submit')}"></s:submit> </s:form>[/code] list.jsp [code="java"]<table align="center"> <tr> <td>序号</td> <td>姓名</td> <td>密码</td> <td>年龄</td> <td>更新</td> <td>删除</td> </tr> <s:iterator value="#request.list" id="us"> <tr> <td><s:property value="#us.id"/></td> <td><s:property value="#us.name"/></td> <td><s:property value="#us.password"/></td> <td><s:property value="#us.age"/></td> <td><s:a href="updatePUser.action?user.id=%{#us.id}">update</s:a></td> <td><s:a href="deleteUser.action?user.id=%{#us.id}">delete</s:a></td> </tr> </s:iterator> </table>[/code] User.java [code="java"]package cn.lz.bean; public class User { private Integer id; private String name; private String password; private Integer age; public User() {} public User(String name, String password, Integer age) { this.name = name; this.password = password; this.age = age; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }[/code] User.hbm.xml [code="java"]<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.lz.bean"> <class name="User" table="user"> <id name="id" type="java.lang.Integer" column="id"> <generator class="increment"/> </id> <property name="name" type="string" column="name"/> <property name="password" type="string" column="password"/> <property name="age" type="java.lang.Integer" column="age"/> </class> </hibernate-mapping> [/code] UserDAO.java UserDAOImpl.java [code="java"]package cn.lz.dao.impl; import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import cn.lz.bean.User; import cn.lz.dao.UserDAO; public class UserDAOImpl extends HibernateDaoSupport implements UserDAO { @SuppressWarnings("unchecked") public List<User> getAllUsers() { return this.getHibernateTemplate().find("from User user order by user.id desc"); } public User getUserById(Integer id) { return (User) this.getHibernateTemplate().get(User.class, id); } public void removeUser(User user) { this.getHibernateTemplate().delete(user); } public void saveUser(User user) { this.getHibernateTemplate().save(user); } public void updateUser(User user) { this.getHibernateTemplate().update(user); } }[/code] UserService.java UserServiceImpl.java [code="java"]package cn.lz.service.impl; import java.util.List; import cn.lz.bean.User; import cn.lz.dao.UserDAO; import cn.lz.service.UserService; public class UserServiceImpl implements UserService { private UserDAO userDAO; public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } public void delete(User user) { this.userDAO.removeUser(user); } public List<User> getAll() { return this.userDAO.getAllUsers(); } public User getById(Integer id) { return this.userDAO.getUserById(id); } public void save(User user) { this.userDAO.saveUser(user); } public void update(User user) { this.userDAO.updateUser(user); } } [/code] struts.xml [code="java"]<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="struts2" extends="struts-default"> <action name="saveUser" class="saveUserAction"> <result name="success" type="redirect">listUser.action</result> <result name="input">/save.jsp</result> </action> <action name="listUser" class="listUserAction"> <result name="success">/list.jsp</result> </action> </package> </struts>[/code] applicationContext.xml [code="java"]<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="lz"/> <!-- 连接池启动时的初始值 --> <property name="initialSize" value="1"/> <!-- 连接池的最大值 --> <property name="maxActive" value="100"/> <!-- 最大空闲值.经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 --> <property name="maxIdle" value="30"/> <!-- 最小空闲值.当空闲的连接数少于阈值时,连接池就会去预申请一些连接,以免洪峰来时来不及申请 --> <property name="minIdle" value="1"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <property name="mappingResources"> <list> <value>cn/lz/bean/User.hbm.xml</value> </list> </property> </bean> <bean id="userDAO" class="cn.lz.dao.impl.UserDAOImpl"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <bean id="userService" class="cn.lz.service.impl.UserServiceImpl"> <property name="userDAO" ref="userDAO"></property> </bean> <bean id="saveUserAction" class="cn.lz.action.user.SaveUserAction" scope="prototype"> <property name="service" ref="userService"></property> </bean> <bean id="listUserAction" class="cn.lz.action.user.ListUserAction" scope="prototype"> <property name="service" ref="userService"></property> </bean> </beans>[/code] web.xml [code="java"]<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <context-param> <param-name>contextConfigLocation </param-name> <param-value>/WEB-INF/classes/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app> [/code]
Spring 2 + Hibernate 3 事务整合问题
公司一直在用Spring + hibernate作为开发框架,事务采用spring声明式,我指定了在BPO(业务层)类中以 ×TX 方法 以事务执行,有以下类 [code="java"] public class BmsLogFacade{ private BmsLogBPO myBmsLogBPO; public void writeLogSave(){ TBmsLogDTO dto=getLogDTO(); myBmsLogBPO.saveTX(dto); System.out.println(dto.getId()); } public void writeLogCreate(){ TBmsLogDTO dto=getLogDTO(); myBmsLogBPO.create(dto); System.out.println(dto.getId()); } public TBmsLogDTO getLogDTO(){ ... } } public class BmsLogBPO{ private BmsLogDAO myBmsLogDAO; public void saveTX(TBmsLogDTO dto) throws AppException { myBmsLogDAO.save(dto); } public void create(TBmsLogDTO dto){ this.saveTX(dto); } } [/code] 当我使用 BmsLogFacade 的 writeLogSave 方法是可以将 DTO 插入到数据库中,而当我使用writeLogCreate 方法,hibernate 都己经打印出来插入语句和DTO的ID信息,而到数据库中查询,却找不到刚插入的那条记录,我怀疑Spring在 调用BmsLogBPO 时创建了一个 AOP 代理,而该代理在 线程方法调用堆栈 中当 第一次调用该类的方法时,即打开了一个事务了,如果该方法没有配置事务时,Spring 默认给它一个只读事务,以致后来执行到代理类的 ×TX需要读写事务时,PROPAGATION_REQUIRED 的属性配置发现己有事务,而不再创建读写事务,致使最终数据不能更新到数据库,因Spring 的AOP 不是太了解,上面只是本人猜测。这问题己困扰我几天了。以下是Spring 配置: [code="xml"] <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>${jdbc.driverClassName}</value> </property> <property name="url"> <value>${jdbc.url}</value> </property> <property name="username"> <value>${jdbc.username}</value> </property> <property name="password"> <value>${jdbc.password}</value> </property> <property name="maxActive"> <value>100</value> </property> <property name="maxIdle"> <value>3</value> </property> <property name="maxWait"> <value>-1</value> </property> <property name="defaultAutoCommit"> <value>false</value> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="lobHandler"> <ref bean="oracleLobHandler" /> </property> <property name="dataSource"> <ref local="dataSource" /> </property> <property name="mappingDirectoryLocations"> <list> <value>classpath:/hbm</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.Oracle9iDialect </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.jdbc.batch_size">0</prop> </props> </property> </bean> <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="transactionAttributes"> <props> <prop key="*RTX">PROPAGATION_REQUIRED,readOnly</prop> <prop key="*TX">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" lazy-init="true" /> <bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true"> <property name="nativeJdbcExtractor"> <ref local="nativeJdbcExtractor" /> </property> </bean> <!--业务组件=============================================--> <bean id="myBmsLogDAO" class="com.homeping.bms.adm.model.dao.BmsLogDAO" lazy-init="default" autowire="default" dependency-check="default"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <bean id="myBmsLogBPO" parent="baseTransactionProxy" lazy-init="default" autowire="default" dependency-check="default"> <property name="target"> <bean class="com.homeping.bms.adm.model.bpo.BmsLogBPO" lazy-init="default" autowire="default" dependency-check="default"> <property name="myBmsLogDAO"> <ref local="myBmsLogDAO" /> </property> </bean> </property> </bean> <bean id="myBmsLogFacade" class="com.homeping.bms.adm.model.facade.BmsLogFacade" lazy-init="default" autowire="default" dependency-check="default"> <property name="myBmsLogBPO"> <ref local="myBmsLogBPO" /> </property> </bean> </beans> [/code] [b]问题补充:[/b] 如果 方法调用栈 第一次调类 BmsLogBPO 的方法匹配 ×TX,即在Spring 中事务对应传播性 PROPAGATION_REQUIRED,数据是能更新到数据中,如果是第一次是调用方法名不为 *TX 而方法体内包含执行 *TX的语句,却始终不能更新到数据库,Hibernate 的更新语句都己经打印出来,并且系统未有任何异常,就是不能同步到数所库中,我都怀疑是不是Spring 声明式事务管理的bug,因为这种置配方式是官方介绍的 [b]问题补充:[/b] 首先感谢 huangnetian 的回复,上面的事务处理是采用声明式,而非编程式,且在业务层,显示的得到session进行事务控制比较麻烦,并且与声明式背道而驰了
请教hibernate.connection.autocommit的问题
用Spring整合Hibernate。没有用事务,Spring配置如下: [code="java"]<beans> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"> </property> <property name="url" value="jdbc:mysql://localhost:3306/mydb"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> [color=red]<prop key="hibernate.connection.autocommit">false</prop>[/color] </props> </property> <property name="mappingResources"> <list> <value>vo/Student.hbm.xml</value> </list> </property> </bean> </beans>[/code] public class StudentDaoImpl extends HibernateDaoSupport implements StudentDao{ public void save(Student stu) { [color=red]this.getHibernateTemplate().save(stu); //问题:为什么上面设置autocommit为false,但这里还是会提交到数据库中[/color] } } [b]问题补充:[/b] 谢谢你的回复。 我用的是MySQL,但我发现即使加个声明式事务,调用getHibernateTemplate().save(stu)方法还是会插入到数据库中。以下是我的事务配置: <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean> <bean id="studentDaoProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager"/> </property> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> <property name="target"> <ref local="studentDao"/> </property> </bean> <bean id="studentDao" class="vo.StudentDaoImpl"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> 这是我的测试类: public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); StudentDao studentDao = (StudentDao)context.getBean("studentDaoProxy"); //添加操作 Student student = new Student(); student.setName("测试"); studentDao.save(student); } }
spring2.0+hibernate的奇怪问题
我的目的很简单; new 一个studnet 然后把它保存到数据库; [code="java"]public class hibernateDaoHbn extends HibernateDaoSupport { public static void main(String[] args) { Student student=null; student=new Student(); student.setAge("15"); student.setName("kulinglei"); List<Student> list=null; hibernateDaoHbn hdao=null; ApplicationContext ctx=null; ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); hdao=(hibernateDaoHbn) ctx.getBean("dao"); hdao.getHibernateTemplate().saveOrUpdate(student); list=(List<Student>)hdao.getHibernateTemplate().find("From Student"); System.out.println(list.get(0).getOid()) } }[/code] 我的数据就是保存不到数据库、 但显示的oid一直在增加 如果我先把一些数据放到数据库。用 list=(List<Student>)hdao.getHibernateTemplate().find("From Student"); for(Student s:list){ System.out.println(s.getOid) } 事先保存的可以在控制台看到 也就是可以访问但不能插入(权限不用考虑。) [b]问题补充:[/b] 先谢谢gembler 我试了之后还不行; 我想不是那个原因。我记得以前我上面的代码就可以保存的。 是不是我的jar包有问题啊。希望大家来看看。帮帮忙 [b]问题补充:[/b] 我的spring文件 [code="java"]<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="SessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"> </property> </bean> <bean id="dao" class="test.hibernateDaoHbn"> <property name="sessionFactory" ref="SessionFactory"> </property> </bean> </beans>[/code] [b]问题补充:[/b] 控制台显示 Hibernate: insert into Student (name, age) values (?, ?) [b]问题补充:[/b] 我用的是hibernate的模板;没有配置事务,应该是用了默认的事务吧。 [b]问题补充:[/b] 我记得以前不用事务就可以保存的(spring1.x) 现在加了事务以解决 方法如下 [code="java"]public class hibernateDaoHbn extends HibernateDaoSupport implements hiDao { public static void main(String[] args) { hiDao hdao=null; ApplicationContext ctx=null; ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); hdao=(hiDao)ctx.getBean("dao"); hdao.execu(); } public void execu() { Student student=null; student=new Student(); student.setAge("15"); student.setName("kulinglei"); student.setOid(2L); List<Student> list=null; this.getHibernateTemplate().save(student); list=(List<Student>) this.getHibernateTemplate().find("From Student"); System.out.println(list.size()); } }[/code] [code="java"]<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <bean id="SessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="SessionFactory"/> </bean> <bean id="dao" class="test.hibernateDaoHbn"> <property name="sessionFactory" ref="SessionFactory"> </property> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>[/code] [code="java"] public interface hiDao { @Transactional(propagation=Propagation.REQUIRED) public void execu(); }[/code] 请问一下spring2.0的注释驱动事务 不用接口怎么配置啊 [b]问题补充:[/b] 不用接口代理已经解决 加上它就可以了 <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy> [b]问题补充:[/b] 谢谢了,你给的方向是正确的
小白求教 android中listview的点击冲突问题
刚才写了一段代码 想通过点击listview上每一项的imageview删除数据库中对应的这一条数据, 但运行时每次都必须点击两下imageview才能删除这一项,之前想过在listview的适配器中来做这个 操作,但是看过的代码好像都没有这么做过并且这样做的话没法更新数据,现在想问问 有没有什么好的方法可以解决这个问题 。对了,设置focusable和clickable属性也没法处理。设置成imagebutton的话 , 由于listview的每一项是通过反射来获取到的 给imagebutton设置onclick属性的话 ,数据就没法传递了,毕竟还是要删除数据库中的数据 ```package com.personal.fyd.blacknumber; import android.content.Context; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import java.util.List; /** * Created by asus on 2016/10/19. */ public class MyAdapter extends BaseAdapter { private List<NumberBean> list; private Context context; public MyAdapter(List<NumberBean> list, Context context) { this.list = list; this.context = context; // for (NumberBean bean:list // ) { // Log.i(context+"",bean.getNumber()+" "+bean.getMode()); // } } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; NumberBean bean; if (convertView == null) { convertView = View.inflate(context, R.layout.item, null); viewHolder = new ViewHolder(); viewHolder.number_tv = (TextView) convertView.findViewById(R.id.tv_number); viewHolder.mode_tv = (TextView) convertView.findViewById(R.id.tv_mode); viewHolder.delete_iv = (ImageView) convertView.findViewById(R.id.iv_delete); convertView.setTag(viewHolder); }else { viewHolder = (ViewHolder) convertView.getTag(); } bean = list.get(position); viewHolder.number_tv.setText(bean.getNumber()); String mode = bean.getMode(); if ("1".equals(mode)){ viewHolder.mode_tv.setText("电话拦截"); }else if ("2".equals(mode)){ viewHolder.mode_tv.setText("短信拦截"); }else if ("3".equals(mode)){ viewHolder.mode_tv.setText("全部拦截"); } return convertView; } static class ViewHolder { TextView number_tv; TextView mode_tv; ImageView delete_iv; } } ``` package com.personal.fyd.blacknumber; import android.content.Context; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.Toast; import java.util.List; public class MainActivity extends AppCompatActivity { private final Context context = MainActivity.this; private ListView lv; private AlertDialog alertDialog; private NumberDao numberdao; private MyAdapter adapter; private List<NumberBean> list; private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); updateLV(); } private void updateLV() { list = numberdao.findAll(); adapter = new MyAdapter(list,MainActivity.this); lv.setAdapter(adapter); } private void initView() { lv = (ListView) findViewById(R.id.lv); numberdao = new NumberDao(this); iv = (ImageView) findViewById(R.id.iv_delete); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, final int position, long id) { Toast.makeText(context,"再次点击删除此项",Toast.LENGTH_SHORT).show(); view.findViewById(R.id.iv_delete).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String num = list.get(position).getNumber(); // Toast.makeText(context,num,Toast.LENGTH_SHORT).show(); numberdao.delete(num); numberdao.findAll(); updateLV(); } }); } }); } public void delete(View view){ } public void add(View view){ showDiagle(); } //显示对话框 private void showDiagle(){ AlertDialog.Builder builder = new AlertDialog.Builder(this); View view = View.inflate(this,R.layout.diagle,null); builder.setView(view); final EditText editText = (EditText) view.findViewById(R.id.blacknumber_et); final CheckBox call_cb = (CheckBox) view.findViewById(R.id.call_cb); final CheckBox sms_cb = (CheckBox) view.findViewById(R.id.sms_cb); Button commit = (Button) view.findViewById(R.id.commit_btn); Button cancel = (Button)view.findViewById(R.id.cancel_btn); commit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String number = editText.getText().toString(); //判断是否为空 if (TextUtils.isEmpty(number)){ Toast.makeText(MainActivity.this,"number ",Toast.LENGTH_SHORT).show(); return; } String mode; if (call_cb.isChecked()&&sms_cb.isChecked()){ mode = "3"; }else if (call_cb.isChecked()){ mode = "1"; }else if (sms_cb.isChecked()){ mode = "2"; }else { Toast.makeText(MainActivity.this,"请至少选择一种拦截方式",Toast.LENGTH_SHORT).show(); return; } //操作合法 插入数据 numberdao.insert(number,mode); //插入成功 重新查询 alertDialog.dismiss(); updateLV(); } }); cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { alertDialog.dismiss(); } }); alertDialog = builder.create(); alertDialog.show(); } } ``` ```
初学hibernate,简单地用了一下SSH2,出现一种难明的错误
用《开发者突击》里面的初步搭建SSH2的代码,连接sqlserver2005,出现下面提示: Hibernate: select user0_.ID as ID, user0_.username as username0_, user0_.password as password0_, user0_.email as email0_ from user user0_ where user0_.username=? WARN - SQL Error: 156, SQLState: S0001 ERROR - 关键字 'user' 附近有语法错误。 2010-12-28 22:22:11 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet default threw exception com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'user' 附近有语法错误。 数据库中我建了表 user,属性有id username password email。 applicationContext 代码如下: [code="xml"] <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"> </property> <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=DeviceManagement;"> </property> <property name="username" value="sa"></property> <property name="password" value="123456"></property> </bean> <!-- 配置Hibernate --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="mappingResources"> <list> <value>com/demo/hibernate/beans/User.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.SQLServerDialect </prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <!-- 配置事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <!-- 定义DAO --> <bean id="userDAO" class="com.demo.hibernate.dao.UserDAO"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <!-- 定义DAO代理 --> <bean id="UserDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="target"> <ref local="userDAO" /> </property> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> <!-- 定义Struts配置 --> <bean name="loginAction" class="com.demo.struts2.actions.LoginAction"> <property name="userDAO"> <ref local="userDAO" /> </property> </bean> <bean name="logoutAction" class="com.demo.struts2.actions.LogoutAction"> <property name="userDAO"> <ref local="userDAO" /> </property> </bean> <bean name="registerAction" class="com.demo.struts2.actions.RegisterAction"> <property name="userDAO"> <ref local="userDAO" /> </property> </bean> <!-- 配置拦截器 --> <bean name="logger" class="com.demo.spring.aop.LoggingInterceptor" /> <!-- 配置拦截器代理 --> <bean name="loggingAutoProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>/login</value> <value>/register</value> </list> </property> <property name="interceptorNames"> <list> <value>logger</value> </list> </property> </bean> [/code] [size=x-large]提示错误行在UserDao里面, [/size]UserDao [code="java"] package com.demo.hibernate.dao; import java.util.ArrayList; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.demo.hibernate.beans.User; public class UserDAO extends HibernateDaoSupport implements IUserDAO { // 验证用户名和密码 public boolean isValid(final String username, final String password) { System.out.println("UserDao检验是否有效"); System.err.println("username:"+username+",password:"+password); List list = (List) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { /////////////////////////////////////这里报错/////////////////////////////// List result = session.createCriteria(User.class).add( Restrictions.eq("username", username)).add( Restrictions.eq("password", password)).list(); return result; } }); if (list.size() > 0) { return true; } else { return false; } } // 判断某个用户是否存在,只需用用户名查询就可以 public boolean isExist(final String username) { System.err.println("UserDao进行查询"); List list = (List) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { List result = session.createCriteria(User.class).add( Restrictions.eq("username", username)).list(); return result; } }); if (list.size() > 0) { return true; } else { return false; } } //插入新的用户对象到数据库 public void insertUser(User user) { System.err.println("UserDao插入数据"); getHibernateTemplate().saveOrUpdate(user); } //从数据库中取得用户对象 public User getUser(String userid) { System.err.println("UserDao取得对象"); return (User) getHibernateTemplate().get(User.class, new Integer(userid)); } //取得用户所有详细信息 public List getUsers() { System.err.println("UserDao取得数据"); return getHibernateTemplate().find("from User"); } //删除某个用户的所有信息 public void deleteUser(String userid) { System.err.println("UserDao删除某个用户的所有信息"); Object p = getHibernateTemplate().load(User.class, new Integer(userid)); getHibernateTemplate().delete(p); } } [/code] 请问这是为什么呢?
hibernate 手动控制事务回滚失败
spring配置: <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://192.168.0.124:3306/art8k?useUnicode=true&amp;characterEncoding=utf-8" /> <property name="user" value="root" /> <property name="password" value="123456" /> <property name="initialPoolSize"><value>5</value></property> <property name="minPoolSize"><value>20</value></property> <property name="maxPoolSize"><value>100</value></property> <property name="acquireIncrement"><value>5</value></property> <property name="maxIdleTime"><value>100</value></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.show_sql=true hibernate.format_sql=false </value> </property> <property name="packagesToScan" value="com.art8k.platform.*.*.bean"/> </bean> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="get*" read-only="true"/> <tx:method name="find*" read-only="true"/> <tx:method name="list*" read-only="true"/> <tx:method name="*" rollback-for="Exception"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="operation" expression="execution(* com.art8k.platform..service.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="operation" /> </aop:config> <bean id="dao" class="com.art8k.platform.dao.IDaoManager"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <bean id="baseService" abstract="true" class="com.art8k.platform.service.BaseService"> <property name="dao"> <ref bean="dao"/> </property> </bean> BaseService.java public BaseService() { if (SpringUtil.getWebApplicationContext()!=null && SpringUtil.getWebApplicationContext().getBean("dao") != null) { this.dao = (IDaoManager) SpringUtil.getWebApplicationContext().getBean("dao"); } } /** * 数据库操作 dao */ @SuppressWarnings("unchecked") @Resource protected IDaoManager dao; @SuppressWarnings("unchecked") public void setDao(IDaoManager dao) { this.dao = dao; } @SuppressWarnings("unchecked") public IDaoManager getDao() { return dao; } IDaoManager.java public class IDaoManager<T, P, PK extends Serializable> extends HibernateDaoSupport implements GeneraDAO<T, P, PK> { /** * <p> * 持久化业务逻辑数据对象 ,无返回值 * </p> */ public void saveIObject(final T object) { getHibernateTemplate().save(object); } /** * <p> * 持久化业务逻辑数据对象,新增或者更新 ,无返回值 * </p> * * @param object * T 业务逻辑数据对象 */ public void saveOrUpdateIObject(final T object) { getHibernateTemplate().saveOrUpdate(object); } 我自己的service集成BaseService,我在service里的一个方法内插入两条数据,如果出现异常,把本次对数据库的所有操作回滚,现在问题是回滚失败,代码如下: public int saveProduct(HmProduct hmProduct) { int result = ConstanData.SUCCESSCODE; Session sessions = null; sessions = this.getDao().getHibernateTemplate().getSessionFactory().openSession(); sessions.beginTransaction(); try { sessions.save(hmProduct); HmProductLog hmProductLog = new HmProductLog(); hmProductLog.setProductId(hmProduct.getId()); hmProductLog.setPrice(hmProduct.getPrice()); hmProductLog.setCreateTime(new Date()); sessions.save(hmProductLog); } catch (Exception e) { // TODO Auto-generated catch block sessions.getTransaction().rollback(); result = ConstanData.FAILURECODE; e.printStackTrace(); }finally{ sessions.close(); } return result; }
使用JAX-RS框架搭建WebService使用Hibernate访问MySQL出现不能实例化类问题
问题描述:大体思路是这样,我最近在做IOS开发想通过WebService访问服务器端数据库的数据,所以想使用Java搭建一个WebService于是在网上找资料使用Java实现的框架JAX-RS.代码如下: ## com.hnu.hibernate.bean包下的Student.java类 package com.hnu.hibernate.bean; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.OneToMany; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement @Entity @Table(name="student") public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Integer userid; @Column(name="username") private String username; @Column(name="password") private String password; @Column(name="realname") private String realname; @Column(name="age") private Integer age; @Column(name="nationality") private String nationality; @Column(name="language") private String language; @Column(name="year") private float year; @Column(name="studyabroadschool") private String studyabroadschool; public Integer getUserid() { return userid; } public void setUserid(Integer userid) { this.userid = userid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRealname() { return realname; } public void setRealname(String realname) { this.realname = realname; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getNationality() { return nationality; } public void setNationality(String nationality) { this.nationality = nationality; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } public float getYear() { return year; } public void setYear(float year) { this.year = year; } public String getStudyabroadschool() { return studyabroadschool; } public void setStudyabroadschool(String studyabroadschool) { this.studyabroadschool = studyabroadschool; } } ## com.hnu.hibernate.dao包 package com.hnu.hibernate.dao; import java.io.Serializable; import java.util.List; import org.hibernate.Session; import com.hnu.hibernate.util.HibernateSessionFactory; import com.hnu.hibernate.util.HibernateUtil; public class BaseDAO<T> { /** * 插入数据 * * @param object */ public int create(T object) { Session session = HibernateSessionFactory.getSession(); try { session.beginTransaction(); session.persist(object); session.getTransaction().commit(); } catch (Exception e) { session.getTransaction().rollback(); return 0; } finally { session.close(); } return 1; } /** * 更新数据库 * * @param object */ public int update(T object) { Session session = HibernateSessionFactory.getSession(); try { session.beginTransaction(); session.update(object); session.getTransaction().commit(); } catch (Exception e) { session.getTransaction().rollback(); return 0; } finally { session.close(); } return 1; } /** * 从数据库中删除 * * @param object */ public int delete(T object) { Session session = HibernateSessionFactory.getSession(); try { session.beginTransaction(); session.delete(object); session.getTransaction().commit(); } catch (Exception e) { session.getTransaction().rollback(); return 0; } finally { session.close(); } return 1; } /** * 查找单个Entity Bean * * @param clazz * @param id * @return */ @SuppressWarnings("unchecked") public T find(Class<? extends T> clazz, Serializable id) { Session session = HibernateSessionFactory.getSession(); try { session.beginTransaction(); return (T) session.get(clazz, id); } finally { session.getTransaction().commit(); session.close(); } } /** * 查找多个Entity Bean * * @param hql * @return */ @SuppressWarnings("unchecked") public List<T> list(String hql) { Session session =HibernateSessionFactory.getSession(); try { session.beginTransaction(); return session.createQuery(hql).list(); } finally { session.getTransaction().commit(); session.close(); } } } ## com.hnu.hibernate.bean包下生成的WebService Javabean StudentsResource.java类 package com.hnu.hibernate.bean; import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import com.hnu.hibernate.dao.BaseDAO; @Produces("application/xml") @Path("students") public class StudentsResource { private BaseDAO<Student> baseDAO=new BaseDAO<Student>(); @GET public List<Student> getStudents() { return baseDAO.list("from Student"); } } ## com.hnu.hibernate.util包下Hibernate获取Session的类 HibernateSessionFactory.java类 package com.hnu.hibernate.util; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; /** * Configures and provides access to Hibernate sessions, tied to the * current thread of execution. Follows the Thread Local Session * pattern, see {@link http://hibernate.org/42.html }. */ public class HibernateSessionFactory { /** * Location of hibernate.cfg.xml file. * Location should be on the classpath as Hibernate uses * #resourceAsStream style lookup for its configuration file. * The default classpath location of the hibernate config file is * in the default package. Use #setConfigFile() to update * the location of the configuration file for the current session. */ private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); private static org.hibernate.SessionFactory sessionFactory; private static Configuration configuration = new Configuration(); private static ServiceRegistry serviceRegistry; static { try { configuration.configure(); serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } catch (Exception e) { System.err.println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } private HibernateSessionFactory() { } /** * Returns the ThreadLocal Session instance. Lazy initialize * the <code>SessionFactory</code> if needed. * * @return Session * @throws HibernateException */ public static Session getSession() throws HibernateException { Session session = (Session) threadLocal.get(); if (session == null || !session.isOpen()) { if (sessionFactory == null) { rebuildSessionFactory(); } session = (sessionFactory != null) ? sessionFactory.openSession() : null; threadLocal.set(session); } return session; } /** * Rebuild hibernate session factory * */ public static void rebuildSessionFactory() { try { configuration.configure(); serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } catch (Exception e) { System.err.println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } /** * Close the single hibernate session instance. * * @throws HibernateException */ public static void closeSession() throws HibernateException { Session session = (Session) threadLocal.get(); threadLocal.set(null); if (session != null) { session.close(); } } /** * return session factory * */ public static org.hibernate.SessionFactory getSessionFactory() { return sessionFactory; } /** * return hibernate configuration * */ public static Configuration getConfiguration() { return configuration; } } ## hibernate.cfg.xml部署文件 <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <property name="hbm2ddl.auto">update</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="connection.url">jdbc:mysql://localhost:3306/vocabularyadaptivetestingsystem?characterEncoding=UTF-8</property> <property name="connection.username">root</property> <property name="connection.password">123</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="show_sql">true</property> <property name="current_session_context_class">thread</property> <mapping class="com.hnu.hibernate.bean.Student"/> </session-factory> </hibernate-configuration> 使用本地的ApplicationServer使用Hibernate访问数据库没有任何问题。但是一旦把访问Hibernate的方法部署到Tomcat服务器上,访问WebService方法没有问题,但是使用WebService调用如下代码:baseDAO.list("from Student"); 就出现了如图所示的错误: ![图片说明](https://img-ask.csdn.net/upload/201607/20/1468960531_454273.png) 希望各位高手帮忙看一下,搞了好久没搞出来,重分酬谢!
SSH主键冲突问题!
系统用的是SSH框架: 我系统登录、退出要写入数据库日志。 有时候很偶然的在退出时写数据库日志报错。 错误是日志表主键冲突,可怎么也想不明白为什么冲突。 这时候再登陆也登陆不进去了,因为也要插入日志表,还是主键冲突。 过10多分钟吧,才能正常登陆,退出也正常了。 1.主键生成方式无论是native还是increament都会报相同的错误(偶尔) 2.SSH集成了hibernate和Spring的JdbcTemplate,由Spring共同管理事务 3.不知道是不是事务的问题,不过在系统其它地方操作数据库的地方没有发现这样的问题。 配置代码: [code="ruby"] <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="url" value="jdbc:oracle:thin:@192.168.1.10:1521:orcl"></property> <property name="username" value="cmonitor"></property> <property name="password" value="cmonitor"></property> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property> <property name="maxActive" value="10"></property> <property name="maxIdle" value="100"></property> <property name="maxWait" value="10"></property> <property name="defaultAutoCommit" value="true"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> <prop key="hibernate.show_sql">false</prop> </props> </property> <property name="mappingResources"> <list> <value></value> </list> </property> </bean> <bean id="JdbcTemplate" class ="org.springframework.jdbc.core.JdbcTemplate"> <property name ="dataSource" ref="dataSource"></property> </bean> <!--配置hibernate事务管理--> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> <property name="dataSource" ref="dataSource"></property> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> <bean id="txManager" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="transactionManager" /> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> [/code]
mybatis spring 整合 junit测试。 事务不起作用,不提交。插入无效???
applicationContext.xml 中的数据库和 sessionFactory以及事务配置 [code="xml"] <bean id="bssDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <!-- Connection Info --> <property name="driverClassName" value="${bss.jdbc.driver}" /> <property name="url" value="${bss.jdbc.url}" /> <property name="username" value="${bss.jdbc.username}" /> <property name="password" value="${bss.jdbc.password}" /> <!-- Connection Pooling Info --> <property name="maxActive" value="${bss.dbcp.maxActive}" /> <property name="maxIdle" value="${bss.dbcp.maxIdle}" /> <property name="defaultAutoCommit" value="false" /> <!-- 连接Idle一个小时后超时 --> <property name="timeBetweenEvictionRunsMillis" value="3600000" /> <property name="minEvictableIdleTimeMillis" value="3600000" /> <property name="testOnBorrow" value="true" /> <property name="testWhileIdle" value="true" /> <property name="validationQuery" value="${bss.dbcp.validationQuery}" /> </bean> <!-- MyBatis配置 --> <bean id="bssSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="bssDataSource" /> <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 别名 --> <property name="typeAliasesPackage" value="com.jxnc56.bss.entity" /> <!-- 显式指定Mapper文件位置 --> <property name="mapperLocations" > <list> <value> classpath:config/mybatis/sqlmap/bss/**/*.xml </value> </list> </property> </bean> <!-- 扫描basePackage下所有以@MyBatisRepository标识的 接口--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.jxnc56.bss" /> <property name="annotationClass" value="com.jxnc56.bss.dao.MyBatisRepository"/> </bean> <!-- 事务管理,@Transactional("tmBss") --> <bean id="tmBss" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="bssDataSource"></property> <qualifier type="org.springframework.beans.factory.annotation.Qualifier" value="tmBss" /> </bean> <!-- 使用annotation定义数据库事务,这样可以在类或方法中直接使用@Transactional注解来声明事务 --> <tx:annotation-driven transaction-manager="tmBss" proxy-target-class="true" /> [/code] java TEST: [code="java"] @Transactional("tmBss") public class ProductServiceTest extends SpringTransactionalTestCase { @Autowired private ProductDao pDao; @Test public void deleteTest (){ pDao.delete(4); Product product = new Product(); product.setId(4); System.out.println("-------------------------------------------->"+Arrays.toString(pDao.select(product).toArray())); } } [/code] 其中ProductDao 是被@MyBatisRepository标示的接口 log: 2013-06-07 09:40:57 107 - org.mybatis.spring.transaction.SpringManagedTransaction -915 [main] DEBUG org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [jdbc:mysql://localhost/nrcompany?useUnicode=true&characterEncoding=utf-8, UserName=root@localhost, MySQL-AB JDBC Driver] will be managed by Spring 2013-06-07 09:40:57 110 - com.jxnc56.bss.dao.ProductDao.delete -918 [main] DEBUG com.jxnc56.bss.dao.ProductDao.delete - ooo Using Connection [jdbc:mysql://localhost/nrcompany?useUnicode=true&characterEncoding=utf-8, UserName=root@localhost, MySQL-AB JDBC Driver] 2013-06-07 09:40:57 115 - com.jxnc56.bss.dao.ProductDao.delete -923 [main] DEBUG com.jxnc56.bss.dao.ProductDao.delete - ==> Preparing: delete from product where id=? 2013-06-07 09:40:57 140 - com.jxnc56.bss.dao.ProductDao.delete -948 [main] DEBUG com.jxnc56.bss.dao.ProductDao.delete - ==> Parameters: 4(Integer) 2013-06-07 09:40:57 142 - org.mybatis.spring.SqlSessionUtils -950 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3a9d95] 2013-06-07 09:40:57 142 - org.mybatis.spring.SqlSessionUtils -950 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3a9d95] from current transaction
spring mvc+mybatis 事务控制不起作用
用的是spring mvc和mybatis框架。数据库是mysql。然后发现事务配置了不起作用。。业务逻辑是新增用户,用户新增成功之后再在其他表插入一条对应的用户角色关联信息。现在问题是假如用户插入成功之后。。插入对应的用户角色关联信息出错后,用户那条新增记录不能自动删除。看了很多人说是因为@service提前扫描的问题。那个我改过了。还有说是表的引擎不是InnoDB。但是我们建的表是InnoDB。还有说要抛出RuntimeException。我也抛出了。。但是还是没用。没办法。请大家看下: -serlet.xml: [code="xml"] <mvc:resources mapping="/resources/**" location="/resources/" /> <context:annotation-config /> <mvc:annotation-driven /> <!-- ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 --> <context:component-scan base-package="com.xuanyan.uebuycar.*"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> <!-- ②:启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="cacheSeconds" value="0" /> <property name="webBindingInitializer"> <bean class="com.xuanyan.uebuycar.admin.util.WebDataBinder4DateAndTime"/> </property> </bean> <!-- ③:对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".html"/> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="i18n/messages"/> [/code] applicationContext.xml: [code="xml"] <!-- 用于持有ApplicationContext,可以使用SpringContextHolder.getBean('xxxx')的静态方法得到spring bean对象 --> <bean class="com.xuanyan.uebuycar.admin.util.SpringContextHolder" lazy-init="false" /> <!-- define the SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="proxool" /> <property name="configLocation" value="classpath:mybatis-config.xml" /> </bean> <!-- 数据连接事务 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="proxool" /> </bean> <!-- 不扫描带有@Controller注解的类。因为这些类已经随容器启动时,在servlet-context中扫描过一遍了 --> <context:component-scan base-package="com.xuanyan.uebuycar"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- 激活annotation功能 --> <context:annotation-config /> <!-- 激活annotation功能 --> <context:spring-configured/> <!-- mybatis接口 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.xuanyan.uebuycar.admin.dao" /> </bean> <!-- 连接事务的注解配置 --> <tx:annotation-driven transaction-manager="transactionManager" /> <aop:config proxy-target-class="true"> <aop:pointcut id="fooServiceOperation" expression="execution(* com.xuanyan.uebuycar.admin.service..*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation" /> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- the transactional semantics... --> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> </tx:attributes> </tx:advice> [/code] 方法: [code="java"] public String addOrUpdate(SysUser record,SysUser currUser,String actionType,String roleId){ String str=getDefJsonString(false, "操作失败,请稍后再试!"); try { if(record!=null){ Date now=new Date(); SysUserExample example=new SysUserExample(); example.createCriteria().andUserCodeEqualTo(record.getUserCode()); List<SysUser> list=sysUserMapper.selectByExample(example); if("add".equalsIgnoreCase(actionType)){ if(list!=null&&list.size()>0){ str=getDefJsonString(false, "操作失败,该账号已存在!"); return str; } String userId=CommonUtil.getUUIDString(); record.setUserId(userId); record.setUserPassword(CommonUtil.getMD5Str(SystemCommonParam.DEFAULT_USER_PWD)); record.setUpdateUser(currUser.getUserCode()); record.setUpdateTime(now); if(sysUserMapper.insertSelective(record)>0){ SysRoleUser ru=new SysRoleUser(); // ru.setRoleUserId(CommonUtil.getUUIDString()); ru.setRoleId(roleId); ru.setUserId(userId); ru.setUpdateUser(currUser.getUserCode()); ru.setUpdateTime(now); if(sysRoleUserMapper.insertSelective(ru)>0){ str=getDefJsonString(true, "新增成功!"); } } }else if("edit".equalsIgnoreCase(actionType)){ if(list!=null&&list.size()>0){ if(!list.get(0).getUserId().equals(record.getUserId())){ str=getDefJsonString(false, "操作失败,该账号已存在!"); return str; } } record.setUpdateUser(currUser.getUserCode()); record.setUpdateTime(now); if(sysUserMapper.updateByPrimaryKeySelective(record)>0){ SysRoleUser ru=new SysRoleUser(); ru.setRoleId(roleId); SysRoleUserExample ex=new SysRoleUserExample(); ex.createCriteria().andUserIdEqualTo(record.getUserId()); if(sysRoleUserMapper.updateByExampleSelective(ru, ex)>0){ str=getDefJsonString(true, "修改成功!"); } } } } } catch (Exception e) { str=getDefErrorString(); e.printStackTrace(); throw new RuntimeException(); } return str; } [/code] 类路径:com.xuanyan.uebuycar.admin.services.sys.SysUserService 希望各位有知道能够告知一下。。是不是我service方法写的不对?
SSH 中 atomikos集成JTA 事务无法回滚
applicationContext.xml配置文件如下 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <description>oracle xa datasource</description> <property name="uniqueResourceName"> <value>oracle1</value> </property> <property name="xaDataSourceClassName"> <value>oracle.jdbc.xa.client.OracleXADataSource</value> </property> <property name="xaProperties"> <props> <prop key="user">test</prop> <prop key="password">test</prop> <prop key="URL">jdbc:oracle:thin:@192.168.0.28:1521:test</prop> </props> </property> </bean> <bean id="dataSourceOracle" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName"> <value>oracle2</value> </property> <property name="xaDataSourceClassName"> <value>oracle.jdbc.xa.client.OracleXADataSource</value> </property> <property name="xaProperties"> <props> <prop key="user">test1</prop> <prop key="password">test1</prop> <prop key="URL">jdbc:oracle:thin:@192.168.0.28:1521:test</prop> </props> </property> </bean> <bean id="sessionFactory1" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.Oracle9Dialect </prop> <prop key="hibernate .show_sql">true</prop> <prop key="hibernate.max_fetch_depth">1</prop> <prop key="hibernate.jdbc.fetch_size">20</prop> <prop key="hibernate.query.factory_class"> org.hibernate.hql.ast.ASTQueryTranslatorFactory </prop> </props> </property> <property name="jtaTransactionManager" ref="atomikosTransactionManager" /> <property name="mappingDirectoryLocations"> <list> <value> classpath*:com/yappam/model/ </value> </list> </property> </bean> <bean id="sessionFactory2" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSourceOracle" /> </property> <property name="hibernateProperties"> <props>[b][/b] <prop key="hibernate.dialect"> org.hibernate.dialect.Oracle9Dialect </prop> <prop key="hibernate .show_sql">true</prop> <prop key="hibernate.max_fetch_depth">1</prop> <prop key="hibernate.jdbc.fetch_size">20</prop> <prop key="hibernate.query.factory_class"> org.hibernate.hql.ast.ASTQueryTranslatorFactory </prop> </props> </property> <property name="jtaTransactionManager" ref="atomikosTransactionManager" /> <property name="mappingLocations"> <list> <value> classpath*:com/yappam/model/oracle/*.hbm.xml </value> </list> </property> </bean> <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <property name="forceShutdown"> <value>true</value> </property> </bean> <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="userTransaction" ref="atomikosUserTransaction" /> <property name="transactionManager" ref="atomikosTransactionManager"> </property> </bean> <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> <property name="transactionTimeout"> <value>240</value> </property> </bean> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception" /> <tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception" /> <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception" /> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <aop:config proxy-target-class="true"> <aop:pointcut id="iPointCuts" expression="execution(* com.yappam.service.impl..*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="iPointCuts" /> </aop:config> </beans> 如果将事务的隔离界别设置成 read-only="true",则两个数据库都才、不能插入数据, 但是我现在 User user=new User(); user.setId("0000000000128359568004600001372");//不存在数据 userDao.delete(user); Test t=new Test(); t.setId(IDGenerator.getId()); t.setUsername("222"); testDao.save(t); 我先删除一条不存在信息抛出异常,但是事务却不回滚,任然可以有一个数据库插入成功? 请大家帮忙解决下!谢谢
hibernate getHibernateTemplate().save无任何异常,SQL里就是没数据
环境:myeclipse8.0,tomcat6.0,struts2,hibernate3.2,spring2.5,jndi spring配制文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property> <property name="url" value="jdbc:sqlserver://localhost:1433;DatabaseName=huaman"></property> <property name="username" value="sa"></property> <property name="password" value="sa"></property> <property name="maxActive" value="100"></property> <property name="maxIdle" value="30"></property> <property name="maxWait" value="10000"></property> <property name="defaultAutoCommit" value="false"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> <property name="mappingResources"> <list> <value>com/huaman/entity/UserInfo.hbm.xml</value> </list> </property> </bean> <!-- TransactionManager --><!-- 注释1 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <bean id="transactionProxyFactoryBean" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref local="transactionManager" /> </property> <property name="transactionAttributes"> <props> <prop key="delete*">PROPAGATION_REQUIRED</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="select*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="add*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="has*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> --> <bean id="userDao" class="com.huaman.dao.impl.UserDaoImpl" scope="singleton"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <bean id="userBiz" class="com.huaman.biz.impl.UserBizImpl"> <property name="userDao" ref="userDao"></property> </bean> <bean id="loginAction" class="com.huaman.action.user.UserInfoAction" scope="prototype"> <property name="userBiz" ref="userBiz"></property> </bean> <bean id="registerAction" class="com.huaman.action.user.UserRegisterAction" scope="prototype"> <property name="userBiz" ref="userBiz"></property> </bean> </beans> DAO:方法名addUser;super.getHibernateTemplate().save(userInfo); 在网上找了很多,改了半天就是不行,hibernate.xml里也有:<property name="connection.autocommit">true </property>。hibernate插入语句也能出来,死活就是不写进数据库。
spring3 注解式事务不起作用
用spring3+hibernate配置注解式事务,测试的时候抛出异常总是不回滚。 [size=medium][color=red]spring主配置文件hibernate.xml[/color][/size] <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" default-lazy-init="true"> <context:annotation-config /> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" /> <property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" /> <property name="user" value="xxx" /> <property name="password" value="xxx" /> <!--连接关闭时默认将所有未提交的操作回滚。Default: false --> <property name="autoCommitOnClose" value="true" /> <property name="initialPoolSize" value="20" /> <property name="minPoolSize" value="20" /> <property name="maxPoolSize" value="50" /> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <!-- <property name="acquireIncrement" value="3" /> --> <!--最大空闲时间,240秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> <!-- <property name="maxIdleTime" value="240" /> --> <!-- <property name="maxIdleTimeExcessConnections" value="1800" /> --> <!-- 每240秒检查连接池中所有空闲连接,默认值:0 --> <!-- <property name="idleConnectionTestPeriod" value="240" /> --> <!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意: 测试的表必须在初始数据源的时候就存在。Default: null --> <!-- <property name="preferredTestQuery" value="select id from test where id=1" /> --> <!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么 属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试 使用。Default: null <property name="automaticTestTable" value="TEST" /> --> <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> <!-- <property name="acquireRetryAttempts" value="30" /> --> <!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false --> <!-- <property name="testConnectionOnCheckin" value="false" /> --> <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable 等方法来提升连接测试的性能。Default: false --> <!-- <property name="testConnectionOnCheckout" value="false" /> --> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mappingLocations" > <list> <value>classpath*:/com/qymgr/entity/hbm/*.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.Oracle10gDialect hibernate.show_sql=true hibernate.format_sql=true hibernate.query.substitutions=true 1, false 0 hibernate.jdbc.batch_size=20 hibernate.c3p0.max_statements=0 </value> </property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 声明式事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> <!-- 异常 --> <bean id="exceptionResolver" class="com.qymgr.core.exception.ExceptionHandler"/> </beans> [size=medium][color=red]测试的DemoDao接口:DemoDao.java[/color][/size] package com.qymgr.sysmgr.dao; import java.util.List; import com.qymgr.entity.Demo; public interface DemoDao{ List findAll(); void save(Demo demo); } [size=medium][color=red]测试的实现类:DemoDaoImpl.java[/color][/size] package com.qymgr.sysmgr.dao.impl; import java.util.List; import javax.annotation.Resource; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import com.qymgr.entity.Demo; import com.qymgr.sysmgr.dao.DemoDao; @Repository @Transactional public class DemoDaoImpl extends HibernateDaoSupport implements DemoDao{ // @Resource HibernateTemplate hibernateTemplate; public List findAll(){ return getHibernateTemplate().find("from Demo"); } @Transactional public void save(Demo demo){ getHibernateTemplate().save(demo); throw new RuntimeException(); } } 抛出异常了,但是每回数据都成功插入了数据库,求大神指点
相见恨晚的超实用网站
相见恨晚的超实用网站 持续更新中。。。
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载 点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。 ...
字节跳动视频编解码面经
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时想着能进去就不错了,管他哪个岗呢,就同意了面试...
开源一个功能完整的SpringBoot项目框架
福利来了,给大家带来一个福利。 最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户模块,权限模块,菜单模块,功能模块也齐全了,每一个功能都是完整的。 打算把这个框架分享出来,供大家使用和学习。 为什么用框架? 框架可以学习整体...
源码阅读(19):Java中主要的Map结构——HashMap容器(下1)
HashMap容器从字面的理解就是,基于Hash算法构造的Map容器。从数据结构的知识体系来说,HashMap容器是散列表在Java中的具体表达(并非线性表结构)。具体来说就是,利用K-V键值对中键对象的某个属性(默认使用该对象的“内存起始位置”这一属性)作为计算依据进行哈希计算(调用hashCode方法),然后再以计算后的返回值为依据,将当前K-V键值对在符合HashMap容器构造原则的基础上,放置到HashMap容器的某个位置上,且这个位置和之前添加的K-V键值对的存储位置完全独立,不一定构成连续的存储
c++制作的植物大战僵尸,开源,一代二代结合游戏
此游戏全部由本人自己制作完成。游戏大部分的素材来源于原版游戏素材,少部分搜集于网络,以及自己制作。 此游戏为同人游戏而且仅供学习交流使用,任何人未经授权,不得对本游戏进行更改、盗用等,否则后果自负。目前有六种僵尸和六种植物,植物和僵尸的动画都是本人做的。qq:2117610943 开源代码下载 提取码:3vzm 点击下载--&gt; 11月28日 新增四种植物 统一植物画风,全部修...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
Python 基础(一):入门必备知识
Python 入门必备知识,你都掌握了吗?
深度学习图像算法在内容安全领域的应用
互联网给人们生活带来便利的同时也隐含了大量不良信息,防范互联网平台有害内容传播引起了多方面的高度关注。本次演讲从技术层面分享网易易盾在内容安全领域的算法实践经验,包括深度...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程实用技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法,并会持续更新。
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
"狗屁不通文章生成器"登顶GitHub热榜,分分钟写出万字形式主义大作
前言 GitHub 被誉为全球最大的同性交友网站,……,陪伴我们已经走过 10+ 年时间,它托管了大量的软件代码,同时也承载了程序员无尽的欢乐。 上周给大家分享了一篇10个让你笑的合不拢嘴的Github项目,而且还拿了7万+个Star哦,有兴趣的朋友,可以看看, 印象最深刻的是 “ 呼吸不止,码字不停 ”: 老实交代,你是不是经常准备写个技术博客,打开word后瞬间灵感便秘,码不出字? 有什么
推荐几款比较实用的工具,网站
1.盘百度PanDownload 这个云盘工具是免费的,可以进行资源搜索,提速(偶尔会抽风????) 不要去某站买付费的???? PanDownload下载地址 2.BeJSON 这是一款拥有各种在线工具的网站,推荐它的主要原因是网站简洁,功能齐全,广告相比其他广告好太多了 bejson网站 3.二维码美化 这个网站的二维码美化很好看,网站界面也很...
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
相关热词 如何提升c#开发能力 矩阵乘法c# c#调用谷歌浏览器 c# 去空格去转义符 c#用户登录窗体代码 c# 流 c# linux 可视化 c# mvc 返回图片 c# 像素空间 c# 日期 最后一天
立即提问