SSH Spring3事務配置

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章