Title 1
|
|
Title 2
|
Text 1 |
|
Text 2 |
在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事务不起作用"的问题。这个问题可能是由多种原因引起的,包括但不限于配置错误、事务注解使用不当、事务传播行为理解有误等。下面我们将深入探讨这些可能的原因,并...
### AOP与Spring事务处理详解 #### 一、引言:为什么使用框架和设计模式? 在软件开发领域,设计模式和框架是两个重要的概念。设计模式作为一种指导思想,能够帮助开发者更好地解决常见的软件设计问题,确保系统...
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
在实际应用中,理解ThreadLocal在Spring事务处理中的作用有助于优化并发性能和解决多线程环境下的事务问题。例如,如果线程之间需要共享数据,但又不想影响其他线程,ThreadLocal就是一个理想的选择。同时,也要注意...
Spring框架的声明式事务处理是Java企业级应用中不可或缺的一部分,它为开发者提供了一种方便、高效的方式来管理事务。在Spring中,事务管理分为编程式和声明式两种方式,而声明式事务处理则是通过配置来控制事务的...
Spring 事务处理是Java开发中一个至关重要的概念,特别是在企业级应用中,它确保了数据的一致性和完整性。Spring 提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。本篇将深入探讨Spring声明式事务...
### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...
总的来说,Spring 2.0的事务处理机制是其核心功能之一,它通过声明式和编程式的事务管理方式为开发者提供了极大的便利。理解并熟练掌握这些知识,对于构建健壮、高可用的企业级应用至关重要。通过`...
总的来说,Spring事务管理是一个强大的工具,它简化了事务处理的复杂性,使得开发者能够专注于业务逻辑,而无需过多关注事务的细节。通过理解和使用Spring事务流程图,我们可以更好地设计和优化我们的应用程序,确保...
描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现问题,暴露了开发者对Spring事务机制不足够了解的问题。标签“Spring 事务 失效”直接概括了本文的知识点范围,即Spring...
Spring框架的声明式事务处理是其企业级应用中的核心特性之一,它允许开发者通过配置来管理事务,而无需在代码中显式地控制事务的开始、提交和回滚。这种方式极大地提高了代码的可读性和可维护性。在这个"spring声明...
Spring事务处理原理步骤详解 Spring事务处理原理步骤详解是指在Spring框架中实现事务处理的整个过程,它涉及到事务处理的实现、事务处理原理和事务管理器的配置等几个方面。下面是Spring事务处理原理步骤详解的知识...
在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理事务。本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将...
Spring事务原理和配置 Spring事务原理是指Spring框架中的一种机制,用于管理事务,并提供了多种配置方式。事务是指一系列的操作,作为一个整体执行,如果其中某个操作失败,整个事务将回滚。Spring事务原理围绕着两...
Spring事务详细讲解 在 Spring 框架中,事务管理扮演着非常重要的角色。Spring 声明式事务让我们从复杂的事务处理中得到解脱,使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要...
在Spring框架中,事务管理是实现业务...综上所述,这个资源包涵盖了Spring事务管理开发的各个方面,从基础框架到具体实现,为开发者提供了全面的支持。理解并掌握这些知识点,将有助于构建稳定、健壮的事务处理系统。
首先,我们来了解什么是Spring事务管理。在分布式系统或数据库操作中,事务管理是确保数据一致性和完整性的关键机制。Spring框架提供了一种声明式和编程式的事务管理方式,允许开发者轻松地控制事务边界,确保事务的...
这个名为"Spring事务小demo"的项目提供了一个实践示例,帮助开发者了解Spring事务处理的基本概念和用法。 首先,Spring事务管理是Spring框架的核心特性之一,它允许我们以声明式或编程式的方式管理事务。声明式事务...
Spring事务管理提供了统一的事务处理模型,使得开发者无需关注具体数据库访问技术的事务细节,简化了事务控制代码,提高了代码的可读性和可维护性。无论是使用注解还是AOP配置,都能有效地管理和协调事务,确保应用...
Spring事务管理是企业级Java应用中不可或缺的一部分,它确保了数据的一致性和完整性,尤其是在多线程和分布式环境中。本实例将深入探讨Spring事务管理的实现与应用。 首先,Spring事务管理分为编程式事务管理和声明...