我遇到一个问题,当我使用hibernate + spring + mysql将我的数据从页面提交到数据库时,事务未提交。也许我的配置有问题。
以下是我的配置和代码:
1.spring-config.xml(spring的配置)
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/webtest?charset=UTF-8" />
<property name="user" value="root" />
<property name="password" value="kevin" />
<property name="initialPoolSize" value="5"/>
<property name="minPoolSize" value="5"/>
<property name="maxPoolSize" value="15" />
<property name="checkoutTimeout" value="1000" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.kevin" />
<property name="namingStrategy">
<bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.hbm2ddl.auto">select</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<!-- <prop key="connection.autocommit">true</prop> -->
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory"><ref bean="sessionFactory"/></property>
</bean>
<tx:annotation-driven />
</bean>
2.User.java的
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
*
*@author kevin
*@date 2015年5月29日 上午11:24:17
*
**/
@Entity
@Table(name="sys_user")
public class User implements Serializable{
private static final long serialVersionUID = -8693332653054586507L;
@Id
@Column(name="user_id")
private String id;
@Column(name="user_real_name")
private String name;
@Column(name="user_education")
private String edu;
getter()setter()...
}
3.UserService.java
@Service
public class UserService {
@Resource
private UserDao userDao;
@org.springframework.transaction.annotation.Transactional
public boolean createUser(User user) {
try {
user.setId(String.valueOf(new Date().getTime()));
userDao.add(user);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
4,UserDao.java
@Repository
public class UserDao extends BaseDao<User, String>{
public UserDao() {
super(User.class);
}
}
5,BaseDao.java
public abstract class BaseDao<T, PK extends Serializable> {
private SessionFactory sessionFactory;
private Class<T> cls;
public BaseDao(Class<T> t) {
cls = t;
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
@Resource
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
//@Transactional
public void add(T t) throws Exception {
sessionFactory.getCurrentSession().save(t);
//sessionFactory.getCurrentSession().flush();
}
}
上面的代码只是一个测试代码,但是不能持久化到数据库中。当然,如果使用session.flush()
,它可以提交到数据库,但是我认为这不是一个好方法,因为它不能确保事务的一致性。
所以我很困惑我的测试和代码出了什么问题。
当然,如果我使用session.flush(),它可以提交到数据库,但是我认为这不是一个好方法,因为它不能确保事务的一致性。
您声明如果调用flush()一切正常的事实很奇怪,就像flush()!= commit()一样。
通过调用flush()你正在做的是要求JPA提供商写任何未决数据库的更新,现在的事务提交宁当。尽管在某些情况下有必要对flush()进行显式调用,但是通常您不需要这样做,因为JPA提供程序会在尝试提交事务之前刷新所有未决的更新。要注意的关键点是,即使在调用flush之后,您的更新对其他事务也将不可见,直到提交并调用flush不会破坏事务的完整性。
因此,如上所述,您的代码很可能没问题,但是您的问题是误解之一。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句