日期:2014-05-20  浏览次数:20863 次

getHibernateTemplate().save 不能写入数据
spring配置文件中的内容如下:
<!-- 配置sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation"
value="hibernate.cfg.xml">
</property>
</bean>


<!-- 配置DAO -->
<bean id="userDAO"
class="edu.suse.hibernate.dao.implement.UserDAOImpl">
<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 id="UserDAOProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="target">
<ref local="userDAO"/>
</property>
<property name="proxyTargetClass" value="true"/><!-- 使用CGlib -->
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>

UserDAOImpl类中有如下代码:
  public void addUser(User user) {
  try {
  getHibernateTemplate().save(user);
  } catch (RuntimeException re) {
  throw re;
  }
  }

  public User findById(Integer id) {
  try {
  User user = (User) getHibernateTemplate()
  .get("hibernate.po.User", id);
  return user;
  } catch (RuntimeException re) {
  throw re;
  }
  }
我在主程序中调用了addUser(user),按理该向数据库中写入user中属性对应的数据,但是打开Mysql数据库后,发现数据没有写入,而且控制台也没有报错。
如果我在主程序中调用findById,又能得到数据。也就是说:只能读数据,但不能写数据,而且写数据也不报错。
请问大家这是怎么回事?
HibernateTemplate的sava,get等方法应该不用我们进行事务控制吧.

------解决方案--------------------
可以叫spring来管理事务 
你控制台SQL语句有打印出来不?
看是否有insert语句,我再继续帮你找原因
------解决方案--------------------
1 save 需要事务控制一下
2 我怀疑你save的操作是更新。当然不会出现异常。

你查一下你的代码吧。比如
Java code
    public void addUser(User user) { 
        try { 
 System.out.println(user.getId()); // 我怀疑这个add其实是update
            getHibernateTemplate().save(user); 
        } catch (RuntimeException re) { 
            throw re; 
        } 
    }

------解决方案--------------------
没有插入数据到数据库,但是又能通过get方法得到数据。说明你的操作只是在hibernate的缓存中进行,并没有实际操作数据库。
你在你的save方法后,手动执行一下getHibernateTemplate().flush()方法吧。
------解决方案--------------------
我今天也遇到这个问题了 

是因为事务没提交 或 是回滚了的结果
原因是你集成了spring 用myeclipse生产的代码 

你在hibernate.xml配置文件里加上
<property name="connection.autocommit">true</property> 变搞定