起初遇到的问题就是能在页面中查询出数据,比如说登录页面可以登录,但后来发现注册之后也可以登录,不过那是在服务器没关闭之前,因为数据库没有存入数据。
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));
在Test.java 中的main方法中用这种方式不管是dao还是service都能插入到数据库中,但是呢在服务器上dao可以因为dao中的方法使用的是session的beginTransaction() commit()方法做事务,而service我用的hibernateTemplate没有事务的使用所以从页面访问使用dao的action可以增删改查而service不行。后来网上找了很久才知道是事务不对,我对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> "可以去掉