DAO类是myeclipse自动生成的,试了很久,我在同一个方法里使用不的DAO类调用save()方法,一个插入数据成功,一个不成功,没的任何报错。代码:registerAction里的注册方法:employeeDAO.save(employee)成功插入数据,roomDAO.save(room);没有插入数据,但没有报错。 public String employeeRegister() throws Exception {
System.out.println("注册账号为:"+this.account);
employees = employeeDAO.findByEaccount(account);
if(employees.isEmpty())
{
System.out.println("注册信息为:"+this.account+","+this.password+","+this.name);
Employee employee = new Employee();
employee.setEaccount(this.account);
employee.setEpassword(password);
employee.setEname(name);
employeeDAO.save(employee);
Room room = new Room();
room.setRid("00-00005");
room.setRoomType("单人标准间");
room.setRoomPrice(100.0000);
System.out.println("添加的房间信息:"+room.getRid()+","+room.getRoomType()+","+room.getRoomPrice());
roomDAO.save(room);
Sprins配置:<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- Hibernate设置 -->
<!-- 会话工厂设置,读取Hibernate数据库配置信息 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
</props>
</property>
</bean>
<!-- Spring 设置 -->
<!-- 会话模板 -->
<bean id="hibernateTemlate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean><!-- 事务管理器 -->
<bean id="transactionManager" 
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean><!-- 配置持久化类DAO bean -->
<bean id="employeeDAO" class="employeeTable.dao.EmployeeDAOImp">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="roomDAO" class="roomTable.dao.RoomDAOImp">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean><!-- struts2配置Action -->
<bean name="registerAction" class="actions.RegisterAction" scope="prototype">
<property name="managerDAO">
<ref local="managerDAO"/>
</property>
<property name="employeeDAO">
<ref local="employeeDAO"/>
</property>
<property name="roomDAO">
<ref local="roomDAO"/>
</property>
</bean><!-- 配置事务拦截器 -->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="save">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>/roomDAO</value>
<value>/employeeDAO</value>
</list>
</property>
<property name="interceptorNames">
<list><value>transactionInterceptor</value></list>
</property>
</bean>
</beans>

解决方案 »

  1.   

    没报错说明是事务控制的问题,这应该依赖于hibernate的实现,手动提交事务看看效果,如果能成功大可不必理会,因为hibernate最终会提交所有事务的~
      

  2.   

    断点看一下,save(room)的时候,到底有没有生成insert语句,如果有且未报错,那应该如楼上所言,事务还未提交。但早晚会提交的。
      

  3.   

    今天看到了一个帖子有说我这个问题的了,是因为数据库表主键的问题
            <id name="id" type="java.lang.String">
                <column name="id" length="20" />
                <generator class="assigned" />
            </id>
    当class="assigned"时使用getHibernateTemplate().save()是不能插入数据到数据库的
    我的问题之所以一个能插入一个不能插入就是那个不能插入的表主键是这样,两个方法解决:
    1.改成class="native"不过改后对数据库主键的设置有没有影响就不清楚了.
    2.在DAO类里getHibernateTemplate().save(transientInstance)这个地方改成 HibernateTemplate template=super.getHibernateTemplate();
    template.setFlushMode(template.FLUSH_EAGER);
    template.save(transientInstance);这些都是大神们的经验,感谢大神们啊!
      

  4.   

    或者这么写:Session session = this.getSession();
    session.save(transientInstance);
    session.beginTransaction().commit();
      

  5.   

    在hibernate配置中添加一句代码:
    <property name="show_sql">true</property>
    看插入的SQL语句能够打出来么