当前位置: 首页 > 知识库问答 >
问题:

提交事务时,我对hibernate和mysql感到困惑

索曾琪
2023-03-14

我面临一个问题,当我使用HibernateSpringmysql将数据从页面提交到数据库时,事务没有提交。或者也许我的配置有问题。

下面是我的配置和代码:

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.用户。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.用户ervice.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();
    }
}

上面的代码只是一个测试代码,但不能持久保存到数据库中。当然,如果我使用会话。flush(),它可以提交到数据库,但我认为这不是一个好方法,因为它无法确保事务的一致性。

所以我很困惑我的测试和代码出了什么问题。

共有3个答案

阙博容
2023-03-14

使用此

万俟小林
2023-03-14

尝试在spring配置中更改事务配置。xml文件:

<!-- Enable Annotation based Declarative Transaction Management -->
    <tx:annotation-driven proxy-target-class="true"
        transaction-manager="transactionManager" />
燕正德
2023-03-14

当然,如果我使用会话。flush(),它可以提交到数据库,但我认为这不是一个好方法,因为它无法确保事务的一致性。

事实上,如果您调用flush(),您声明一切都有效,这和flush()一样奇怪!=提交()。

通过调用flush(),您所做的就是要求JPA提供者立即向数据库写入任何挂起的更新,而不是在事务提交时。虽然在某些情况下可能需要显式调用flush(),但通常不需要这样做,因为JPA提供程序将在尝试提交事务之前刷新任何挂起的更新。需要注意的关键点是,即使在调用flush之后,您的更新也不会对另一个事务可见,直到提交和调用flush不会破坏事务的完整性。

正如我上面提到的,你的代码很可能很好,但你的问题是理解错误。

 类似资料:
  • 我用这样的JAVA_OPTS启动了 jvm: 过了一段时间,当我查看GC日志时:

  • 我正在尝试提出一种解决方案,它涉及在连接操作之后应用一些逻辑,从多个中的中选择一个事件。这类似于reduce函数,但它只返回1个元素,而不是递增地返回。因此最终结果将是单个(,对,而不是一个 每个键保证只到达一次。 假设像上面这样的连接操作,它用4个生成了1个,成功地连接并收集在。现在,我想做的是,立即访问这些值,并执行一些逻辑以将正确匹配到一个。例如,对于上面的数据集,我需要(,和)。 将为每个

  • 所以我一直在读Kafka的语义学,我对它的工作原理有点困惑。 我理解生产者如何避免发送重复的消息(以防代理的ack失败),但我不明白的是,在消费者处理消息但在提交偏移量之前崩溃的情况下,一次是如何工作的。Kafka不会在这种情况下重试吗?

  • 问题内容: 我对这三个文件的目的感到困惑。如果我的理解是正确的,则是程序在其中写入其在进程中运行任务的请求的文件,是内核在其中写入其输出以及请求其从中访问信息的进程的文件,并且是该文件。输入所有例外。在打开这些文件以检查它们是否确实发生时,我似乎没有任何暗示! 我想知道的是这些文件的用途到底是什么,用很少的技术术语就可以完全肯定答案! 问题答案: 标准输入 -这是您的过程读取以获取您的信息的 文件

  • 问题内容: 据我了解,当在工厂内部时,我返回一个注入到控制器中的对象。在服务内部时,我使用而不是返回任何东西来处理对象。 我当时以为服务 始终是单例 ,并且每个控制器都注入了一个 新的工厂对象 。但是,事实证明,工厂对象也是单例对象吗? 示例代码演示: 当改变的事实证明,在也发生了变化,比如是一个单身? 我的假设是在工厂的控制器中注入了新实例? 问题答案: 所有角度服务都是单例 : Docs(请参

  • 版本:2.1.11 问题:我有一些错误的参数配置:max.poll.records:500 max.poll.interval.ms:10000。但消耗大约需要25000秒。因此,它将遇到异常:org.apache.kafka.clients.consumer.CommitFailedException:提交无法完成,因为组已经重新平衡并将分区分配给了另一个成员。这意味着对poll()的后续调用之