`
HappyDays
  • 浏览: 10913 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

spring的事务功能不起作用?

阅读更多

在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 事务 失效”直接概括了本文的知识点范围,即Spring...

    Spring事务管理开发必备jar包

    本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...

    spring事务操作试验

    本文将深入探讨在"spring事务操作试验"中涉及的关键知识点,并结合提供的资源进行详细阐述。 首先,Spring事务管理的核心概念是ACID(原子性、一致性、隔离性和持久性),这是所有事务系统的基础。在Spring中,事务...

    spring事务案例分析.zip

    在IT行业中,Spring框架...总结,Spring事务管理是其核心功能之一,它简化了事务处理的复杂性,使开发者能够专注于业务逻辑。通过学习和实践案例,我们可以更好地掌握Spring事务的使用,提高应用程序的稳定性和可靠性。

    SPRING事务机制DEMO

    Spring事务机制是Java开发中非常重要的一个概念,它在企业级应用中扮演着核心角色,确保数据的一致性和完整性。Spring提供了多种事务管理方式,包括编程式事务管理和声明式事务管理。在这篇DEMO中,我们将重点探讨...

    实验 spring 声明事务

    Spring 提供了声明式事务管理,允许开发者在不编写事务管理代码的情况下实现事务控制,极大地简化了事务处理。 实验环境主要包括 Eclipse 或 MyEclipse 开发工具,以及 Spring 4.0 及以上版本,JDK 1.7 及以上版本...

    Spring事务管理的jar包

    本篇将深入探讨Spring事务管理的核心概念、工作原理以及如何使用`spring-tx-3.2.0.RELEASE.jar`这个jar包。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组操作,这些操作被视为一个整体,要么全部完成...

    Spring事务传播Demo.zip

    本篇将基于"Spring事务传播Demo"来深入探讨Spring事务管理和传播行为。 首先,我们需要理解什么是事务。在数据库操作中,事务是一组操作,这些操作要么全部执行,要么全部不执行,以确保数据的一致性和完整性。在...

    Spring事务传播机制.docx

    当我们在使用 Spring 所提供的事务功能时,如果是仅仅处理单个的事务,是比较容易把握事务的提交与回滚,不过一旦引入嵌套事务后,多个事务的回滚和提交就会变得复杂起来,各个事务之间是如何相互影响的,是一个值得...

    spring事务详解

    总之,Spring事务框架提供了一套功能强大、易于使用的事务管理解决方案,它不仅可以减少代码量,提高开发效率,还可以通过声明式配置来提升代码的可读性和可维护性。对于希望深入学习Spring事务管理的开发者而言,...

    关于SpringMyBatis纯注解事务不能提交的问题分析与解决

    本文主要针对在Spring + MyBatis环境下,或使用Spring JDBC时,Oracle事务不能正常提交的问题进行了深入分析,并提出了相应的解决方案。根据提供的部分内容,我们发现该问题与不同的数据源配置有关。具体来说,当...

    JavaEE spring事务操作环境和基本功能搭建

    本文将详细讲解如何搭建Spring事务操作环境以及实现基本功能。 首先,理解事务(Transaction)的重要性。在数据库操作中,事务是确保数据一致性和完整性的关键概念。一个事务是一系列数据库操作的集合,这些操作...

    Spring事务详解

    Spring事务还支持多种隔离级别,包括READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE,不同的隔离级别可以防止脏读、不可重复读、幻读等并发问题,但也会对性能产生影响,因此需要根据实际需求...

    spring 事务管理的理解

    Spring 框架是Java开发中...理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在实际开发中,结合声明式事务管理、事务传播行为、隔离级别和回滚规则,可以有效地确保数据的完整性和一致性。

    Spring 事务 代码

    虽然提供的示例是入门级别的,但它揭示了Spring事务管理的核心概念,为进一步学习和理解Spring事务处理的高级特性奠定了基础。在实际项目中,我们需要根据需求选择合适的配置,确保事务的正确性和数据的一致性。

    spring 事务(6中配置完全降解)

    本篇文章将详细解析Spring中的六种事务配置方法,帮助开发者深入理解并掌握Spring事务的运用。 1. **基于XML的事务配置** Spring支持通过XML配置来管理事务,这是最基础的配置方式。在`spring`的配置文件中,我们...

    Spring事务类型祥解

    在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。本篇文章将详细解析Spring中的事务类型,帮助你更好地理解和应用这些知识。 首先,Spring支持两种事务管理方式:编程式...

    Spring Nested事务简单案例

    在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式处理事务边界。在本案例中,我们关注的是Spring中的Nested事务,这是一个相对复杂的特性,但非常有用,特别是在需要子事务处理的场景下...

    Hibernate缓存与spring事务详解

    **标题:“Hibernate缓存与Spring事务详解”** 在IT领域,尤其是Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。而Spring框架则以其全面的功能,包括依赖注入、AOP(面向切...

Global site tag (gtag.js) - Google Analytics