我面临一个问题,当我使用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()
,它可以提交到数据库,但我认为这不是一个好方法,因为它无法确保事务的一致性。
所以我很困惑我的测试和代码出了什么问题。
使用此
尝试在spring配置中更改事务配置。xml
文件:
<!-- Enable Annotation based Declarative Transaction Management -->
<tx:annotation-driven proxy-target-class="true"
transaction-manager="transactionManager" />
当然,如果我使用会话。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()的后续调用之