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> 变搞定