繁体   English   中英

Hibernate不会更新MySQL数据库中的记录

[英]Hibernate doesn't update record in MySQL database

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


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();
}
}

如果您需要任何其他信息或代码-告诉我。 每个答案都受到高度赞赏,并得到迅速回应。

谢谢。

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

在saveOrUpdate()方法之后,只需刷新会话即可。 例如:session.flush();

有关更多详细信息,您可以在这里查看我的博客:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM