起初遇到的问题就是能在页面中查询出数据,比如说登录页面可以登录,但后来发现注册之后也可以登录,不过那是在服务器没关闭之前,因为数据库没有存入数据。
在Test.java 中的main方法中用这种方式不管是dao还是service都能插入到数据库中,但是呢在服务器上dao可以因为dao中的方法使用的是session的beginTransaction() commit()方法做事务,而service我用的hibernateTemplate没有事务的使用所以从页面访问使用dao的action可以增删改查而service不行。BbsusersDAO dao = new BbsusersDAO(); ApplicationContext acx1 = new FileSystemXmlApplicationContext("classpath:applicationContext.xml"); dao = (BbsusersDAO)acx1.getBean("BbsUsersDao"); BbsUsersServiceImpl src = (BbsUsersServiceImpl) acx1.getBean("usersService"); Bbsusers user = src.findById("admin"); System.out.println(user!=null?user.getUname():null); Date d = user.getUbirthday(); user = new Bbsusers("abc4", "张大夫4", "abc1", "54564", d, "女", "leaguer", "2.gif"); System.out.println(dao.insert(user));
后来网上找了很久才知道是事务不对,我对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" 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/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" default-autowire="byName">
需要声明的如上 其中有tx 和 context的语句添加到xml中去,这些就是声明式事务使用的标签格式所需要的<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"> </property> </bean>
sessionFactory
<!-- 配置Spring上下文的注解 --> <context:annotation-config/> <!-- 配置事务管理 --> <bean id="transManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <tx:annotation-driven transaction-manager="transManager"/>
<context:annotation-config/> 这句话有点重要 不写这句话就得写很多注解的bean声明 用于使用@Transactional
import org.springframework.transaction.annotation.Transactional; @Transactional public class BbsTransactional { }
在service类里面继承了这个类就行了,当然我试过写成接口但是之后数据库就没有事务提交了,也可以直接在service类里面直接在类名前面@Transactional也行
package com.project.bbs.service.impl; import com.project.bbs.bean.Bbsusers; import com.project.bbs.hibernate.IBbsUsersDao; import com.project.bbs.service.IBbsUsersService; import com.project.bbs.spring.BbsTransactional; public class BbsUsersServiceImpl extends BbsTransactional implements IBbsUsersService { private IBbsUsersDao usersDao;//BbsUsersDaoSpringImpl public Bbsusers findById(String id) { return usersDao.findById(id); } public boolean insert(Bbsusers user) { return usersDao.insert(user); } public IBbsUsersDao getUsersDao() { return usersDao; } public void setUsersDao(IBbsUsersDao usersDao) { this.usersDao = usersDao; } }
抛开着一切事务配置 ,再找到解决事务不提交的问题前我找到了这个方法在hibernate.xml里面
<session-factory> <property name="dialect">org.hibernate.dialect.Oracle9iDialect</property> <property name="connection.url"> jdbc:oracle:thin:@localhost:1521:orcl </property> <property name="connection.username">scott</property> <property name="connection.password">scott</property> <property name="connection.driver_class"> oracle.jdbc.driver.OracleDriver </property> <property name="format_sql">true</property> <property name="show_sql">true</property> <!-- <property name="connection.autocommit">true</property> --> <property name="myeclipse.connection.profile">scott</property> <mapping resource="com/project/bbs/bean/Bbsusers.hbm.xml" /> </session-factory>
写上这句,事务不写就可以但是网上说这种方法不太好--不是专家不懂
不写了 发泄下成功的喜悦其中"<pre class="java" name="code"></pre> "可以去掉