在CustomerServiceImp类的add()方法里先给customers表里插入一条数据,然后在往Customerdaily表里插入一条数据,由于在Customerdaily.hbm.xml里配置的主键生成是根据customers的主键生成,两张表共用相同的主键,由于customerdaily表的Name属性定义为NOU NULL,在add()方法里没有给CustomerDaily对象的Name属性赋值,这样数据库肯定会抛异常,正常的话,customers和Customerdaily里都不会插入记录,但是程序完执行的时候,customers表里有一条记录,CustomerServiceImp类其实是TransactionProxyFactoryBean类,也就是CustomerServiceImp的代理,但是我用System.out.println(customerService.getClass().getName());语句输出的结果却还是com.ajax.service.CustomerServiceImp,为什么spring的事务在这里没有起作用呢?
customerService类的定义如下,在add()方上加入事务处理,:
package com.ajax.service;
import java.util.List;
import com.ajax.dao.CustomerDailyDao;
import com.ajax.dao.CustomerDao;
import com.ajax.pojos.Customer;
import com.ajax.pojos.Customerdaily;
public class CustomerServiceImp implements CustomerService{
private CustomerDao customerDao;
private CustomerDailyDao customerDailyDao;
public void add(Customer customer) throws Exception {
// TODO Auto-generated method stub
Customerdaily customerDaily=new Customerdaily();
// customerDaily.setName(customer.getName());//注释
customer.setCustomerDaily(customerDaily);
customerDaily.setCustomer(customer);
customerDao.addCustomer(customer);
}
}
数据库表的DDL是这样定义:
create table `ajax`.`customers`(
`id` int not null auto_increment,
`name` varchar(20) default '' not null unique,
`dataofbirthday` date default '' not null,
`sex` varchar(1) default '' not null,
`address` varchar(40) default '' not null,
`amount_water` double,
`amount_elic` double,
`updatedate` varchar(20) default '' not null,
`remark` varchar(100),
primary key (`id`)
);
create table `ajax`.`customerdaily`(
`id` int not null auto_increment,
`name` varchar(20) default '' not null unique,
`usedwaterinmonth` double,
`usedelicinmonth` double,
`managecharge` double,
primary key (`id`)
);
alter table `ajax`.`customerdaily`
add index `customerdaily_ibfk_1`(`id`),
add constraint `customerdaily_ibfk_1`
foreign key (`id`)
references `ajax`.`customers`(`id`);
create index `PRIMARY` on `ajax`.`customerdaily`(`id`);
create index `name` on `ajax`.`customerdaily`(`name`);
customers表的hibernate的配置如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="com.ajax.pojos.Customer" table="customers" >
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<one-to-one name="customerDaily" class="com.ajax.pojos.Customerdaily" cascade="all" outer-join="true"/>
<property name="name" type="java.lang.String">
<column name="name" length="20" not-null="true" />
</property>
<property name="dataofbirthday" type="java.sql.Date">
<column name="dataofbirthday" length="10" not-null="true" />
</property>
<property name="sex" type="java.lang.String">
<column name="sex" length="1" not-null="true" />
</property>
<property name="address" type="java.lang.String">
<column name="address" length="40" not-null="true" />
</property>
<property name="amountWater" type="java.lang.Double">
<column name="amount_water" precision="22" scale="0" />
</property>
<property name="amountElic" type="java.lang.Double">
<column name="amount_elic" precision="22" scale="0" />
</property>
<property name="updatedate" type="java.lang.String">
<column name="updatedate" length="20" not-null="true" />
</property>
<property name="remark" type="java.lang.String">
<column name="remark" length="100" />
</property>
</class>
</hibernate-mapping>
Customerdaily表的hibernate的配置如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="com.ajax.pojos.Customerdaily" table="customerdaily">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="foreign">
<param name="property">customer</param>
</generator>
</id>
<one-to-one name="customer" class="com.ajax.pojos.Customer" constrained="true"/>
<property name="name" type="java.lang.String">
<column name="name" length="20" not-null="true" />
</property>
<property name="usedwaterinmonth" type="java.lang.Double">
<column name="usedwaterinmonth" precision="22" scale="0" />
</property>
<property name="usedelicinmonth" type="java.lang.Double">
<column name="usedelicinmonth" precision="22" scale="0" />
</property>
<property name="managecharge" type="java.lang.Double">
<column name="managecharge" precision="22" scale="0" />
</property>
</class>
</hibernate-mapping>
spring的配置文件是这样的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
<import resource="springDao.xml"/>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="customerService" class="com.ajax.service.CustomerServiceImp">
<property name="customerDao">
<ref bean="customerDao"/>
</property>
<property name="customerDailyDao">
<ref bean="customerDailyDao"/>
</property>
</bean>
<bean id="customerServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="target">
<ref local="customerService"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="add*">PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
</beans>
分享到:
相关推荐
### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...
描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现问题,暴露了开发者对Spring事务机制不足够了解的问题。标签“Spring 事务 失效”直接概括了本文的知识点范围,即Spring...
本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...
本文将深入探讨在"spring事务操作试验"中涉及的关键知识点,并结合提供的资源进行详细阐述。 首先,Spring事务管理的核心概念是ACID(原子性、一致性、隔离性和持久性),这是所有事务系统的基础。在Spring中,事务...
在IT行业中,Spring框架...总结,Spring事务管理是其核心功能之一,它简化了事务处理的复杂性,使开发者能够专注于业务逻辑。通过学习和实践案例,我们可以更好地掌握Spring事务的使用,提高应用程序的稳定性和可靠性。
Spring事务机制是Java开发中非常重要的一个概念,它在企业级应用中扮演着核心角色,确保数据的一致性和完整性。Spring提供了多种事务管理方式,包括编程式事务管理和声明式事务管理。在这篇DEMO中,我们将重点探讨...
Spring 提供了声明式事务管理,允许开发者在不编写事务管理代码的情况下实现事务控制,极大地简化了事务处理。 实验环境主要包括 Eclipse 或 MyEclipse 开发工具,以及 Spring 4.0 及以上版本,JDK 1.7 及以上版本...
本篇将深入探讨Spring事务管理的核心概念、工作原理以及如何使用`spring-tx-3.2.0.RELEASE.jar`这个jar包。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组操作,这些操作被视为一个整体,要么全部完成...
本篇将基于"Spring事务传播Demo"来深入探讨Spring事务管理和传播行为。 首先,我们需要理解什么是事务。在数据库操作中,事务是一组操作,这些操作要么全部执行,要么全部不执行,以确保数据的一致性和完整性。在...
当我们在使用 Spring 所提供的事务功能时,如果是仅仅处理单个的事务,是比较容易把握事务的提交与回滚,不过一旦引入嵌套事务后,多个事务的回滚和提交就会变得复杂起来,各个事务之间是如何相互影响的,是一个值得...
总之,Spring事务框架提供了一套功能强大、易于使用的事务管理解决方案,它不仅可以减少代码量,提高开发效率,还可以通过声明式配置来提升代码的可读性和可维护性。对于希望深入学习Spring事务管理的开发者而言,...
本文将详细讲解如何搭建Spring事务操作环境以及实现基本功能。 首先,理解事务(Transaction)的重要性。在数据库操作中,事务是确保数据一致性和完整性的关键概念。一个事务是一系列数据库操作的集合,这些操作...
本文主要针对在Spring + MyBatis环境下,或使用Spring JDBC时,Oracle事务不能正常提交的问题进行了深入分析,并提出了相应的解决方案。根据提供的部分内容,我们发现该问题与不同的数据源配置有关。具体来说,当...
Spring事务还支持多种隔离级别,包括READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE,不同的隔离级别可以防止脏读、不可重复读、幻读等并发问题,但也会对性能产生影响,因此需要根据实际需求...
Spring 框架是Java开发中...理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在实际开发中,结合声明式事务管理、事务传播行为、隔离级别和回滚规则,可以有效地确保数据的完整性和一致性。
虽然提供的示例是入门级别的,但它揭示了Spring事务管理的核心概念,为进一步学习和理解Spring事务处理的高级特性奠定了基础。在实际项目中,我们需要根据需求选择合适的配置,确保事务的正确性和数据的一致性。
本篇文章将详细解析Spring中的六种事务配置方法,帮助开发者深入理解并掌握Spring事务的运用。 1. **基于XML的事务配置** Spring支持通过XML配置来管理事务,这是最基础的配置方式。在`spring`的配置文件中,我们...
在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。本篇文章将详细解析Spring中的事务类型,帮助你更好地理解和应用这些知识。 首先,Spring支持两种事务管理方式:编程式...
在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式处理事务边界。在本案例中,我们关注的是Spring中的Nested事务,这是一个相对复杂的特性,但非常有用,特别是在需要子事务处理的场景下...
### Spring自定义切面事务问题 #### 背景与挑战 在开发基于Spring框架的应用程序时,我们经常需要利用AOP(面向切面编程)来实现横切关注点(如日志记录、安全控制、事务管理等)的模块化处理。其中,事务管理是...