起初遇到的問題就是能在頁面中查詢出數據,比如說登錄頁面可以登錄,但後來發現註冊之後也可以登錄,不過那是在服務器沒關閉之前,因爲數據庫沒有存入數據。
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> "可以去掉