2014-01-28 62 views
0

我在我的应用程序中使用PrimeFaces 3.5,JSF 2.2,Hibernate 4.1,Spring 3.2.3,MySQL。 函数updateUser()应该为PrimeFaces dataTable组件中的选定用户更新数据库中的记录(值正确),但是由于某些未知原因它没有。我有一个名为AbstractDAO的类,它通过泛型实现了CRUD操作。插入,选择和删除工作完美,但更新失败,根本不显示任何错误。任何线索我的代码中可能会出现什么错误?休眠不更新MySQL数据库中的记录


applicationContext.xml中:

<?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:tx="http://www.springframework.org/schema/tx" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:sec="http://www.springframework.org/schema/security" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 


    <!--   GLOABL SETTINGS    --> 


    <context:component-scan base-package="com.infostroy.adminportal"/> 
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> 


    <!--  DATA SOURCE AND PERSISTENCE SETTINGS  --> 


    <bean id="propertiesPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>classpath:db.properties</value> 
      </list> 
     </property> 
    </bean> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dmDataSource"/> 
     <property name="packagesToScan" value="com.infostroy.adminportal"/> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">${db.dialect}</prop> 
       <prop key="hibernate.show_sql">${db.show_sql}</prop> 
       <prop key="hibernate.hbm2ddl.auto">${db.hbm2ddl_auto}</prop> 
       <prop key="connection.pool_size">${db.pool_size}</prop> 
       <prop key="current_session_context_class">${db.current_session_context_class}</prop> 
       <prop key="org.hibernate.FlushMode">${db.flush_mode}</prop> 
      </props> 
     </property> 
    </bean> 


    <bean id="transactionManager" 
      class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="dataSource" ref="dmDataSource" /> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 


    <bean id="dmDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="${db.driver}" /> 
     <property name="url" value="${db.url}" /> 
     <property name="username" value="${db.username}" /> 
     <property name="password" value="${db.password}" /> 
     <property name="maxWait" value="5000" /> 
     <property name="initialSize" value="2" /> 
     <property name="maxActive" value="100"/> 
     <property name="maxIdle" value="50"/> 
     <property name="minIdle" value="0"/> 
    </bean> 

</beans> 

db.properties:

db.username=root 
db.password=root 
db.driver=com.mysql.jdbc.Driver 
db.url=jdbc:mysql://localhost/adminportal 
db.pool_size=0 
db.dialect=org.hibernate.dialect.MySQLDialect 
db.hbm2ddl_auto=validate 
db.show_sql=true 
db.current_session_context_class=thread 
db.flush_mode=COMMIT 

AbstractDao的:

public abstract class AbstractDAO<T extends Serializable> implements Serializable { 

@Autowired 
protected SessionFactory sessionFactory; 
protected T object; 
protected Class clazz; 

public AbstractDAO(Class clazz) { 
    this.clazz = clazz; 
} 

//Executes before being removed from container 
@PreDestroy 
protected void destroy() { 
    sessionFactory.getCurrentSession().close(); 
} 

public Session getHiberSession() { 
    return sessionFactory.openSession(); 
} 

@Transactional 
protected T getByID(int id) { 
    String queryString = "from " + clazz.getSimpleName() + " where id = :id"; 
    Query query = getHiberSession().createQuery(queryString); 
    query.setInteger("id", id); 
    object = (T) query.uniqueResult(); 
    return object; 
} 

@Transactional 
protected int deleteByID(int id) { 
    String queryString = "delete " + clazz.getSimpleName() + " where id = :id"; 
    Query query = getHiberSession().createQuery(queryString); 
    query.setInteger("id", id); 
    return query.executeUpdate(); 
} 

@Transactional 
protected boolean insert(T object) { 
    try { 
     getHiberSession().save(object); 
     return true; 
    } catch (HibernateException ex) { 
     return false; 
    } 
} 

@Transactional 
protected boolean update(T object) { 
    try { 
     getHiberSession().saveOrUpdate(object); 
     return true; 
    } catch (HibernateException ex) { 
     return false; 
    } 
} 

@Transactional 
protected List getAllRecords() { 
    String queryString = "from " + clazz.getSimpleName(); 
    Query query = getHiberSession().createQuery(queryString); 
    return query.list(); 
} 

}

UserDAO.java:

@Repository 
public class UserDAO extends AbstractDAO<User> { 

public UserDAO() { 
    super(User.class); 
} 

public User getUserById(int id) { 
    return super.getByID(id); 
} 

public int deleteUserById(int id) { 
    return super.deleteByID(id); 
} 

public boolean insertUser(User user) { 
    return super.insert(user); 
} 

public boolean updateUser(User user) { 
    return super.update(user); 
} 

public List<User> getAllUsers() { 
    return super.getAllRecords(); 
} 
} 

如果您需要任何额外的信息或代码 - 只是告诉我。每一个答案都被高度赞赏和灵活回应。

谢谢。

+0

我刚开始使用Hibernate,但我使用sessionFactory.getCurrentSession()代替的openSession()。 –

+0

OMG,用getCurrentSession替换openSession! :D 另一个问题是为什么地狱它适用于其他功能? 请发表您的回复,以便我能接受。 – amenoire

+0

当您使用由Spring(@Transactional)管理的事务时,框架获取会话并在方法之前启动事务并在此之后提交。当你使用当前会话时,你使用相同的会话(和事务)并且没问题,但是openSession()会在其他会话中进行,而不是提交。只是一个猜测。 –

回答

3

我刚刚开始使用Hibernate,但我使用sessionFactory.getCurrentSession()而不是openSession()。

+0

这解决了这个问题。 – amenoire

1

saveOrUpdate()mehod刷新会话后。例如:session.flush();

http://www.onlinetutorialspoint.com/hibernate/hibernate-example.html

+1

会话在提交期间隐式刷新并由Spring进行声明式管理,因此管理会话,事务和刷新没有意义。即使我在saveOrUpdate语句之后明确地使我的函数调用刷新 - 它不能解决问题。解决方案是调用现有会话,而不是创建新会话。不过,谢谢你的贡献。 – amenoire