gpt4 book ai didi

java - 你如何在没有事务的情况下使用 Spring Data JPA?

转载 作者:行者123 更新时间:2023-11-29 03:19:34 25 4
gpt4 key购买 nike

我正在尝试使用 Spring Data JPA 访问 Informix 数据库。数据库本身不支持事务。我们通过 JDBC 访问数据库。当您尝试执行任何事务性操作时,用于 Informix 的 JDBC 驱动程序将抛出错误。 getAutoCommit 返回 true,设置为 false 会抛出错误

遗留代码使用 HibernateTemplate 访问 Informix。服务方法没有任何事务注释

我正在开发一个访问相同数据库的新项目,我想尝试使用 Spring Data。因为,我想继续使用 ORM 层,所以我尝试连接 Spring Data JPA。

所以,我的初始配置是

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="datasource"/>
<property name="packagesToScan" value="org.company.project.business"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">

</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.InformixDialect</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="hibernate.connection.autocommit">false</prop>
<prop key="hibernate.jdbc.use_get_generated_keys">true</prop>
<prop key="hibernate.order_updates">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.connection.release_mode">after_transaction</prop>
</props>
</property>
</bean>
<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close" depends-on="c3p0InformixConnectionCustomizer">
<constructor-arg type="java.lang.String" value="database"/>
<property name="driverClass" value="com.informix.jdbc.IfxDriver"/>
<property name="jdbcUrl" value="${database.jdbc.url}"/>
<property name="user" value="${database.jdbc.user}"/>
<property name="password" value="${database.jdbc.password}"/>
</bean>



<bean id="persistenceExceptionTranslationPostProcessor"
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

<jpa:repositories base-package="org.company.project.respository" entity-manager-factory-ref="emf"/>

不幸的是,Spring 数据提示我需要一个事务管理器。但是,我不需要事务管理器!我什至不需要交易

所以,对于狗屎和傻笑,我声明了 Jpa 事务管理器

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emf"/>
</bean>

很明显,Informix 驱动程序开始提示不支持事务

所以,问题是我如何告诉 Spring Data 不要使用事务拦截器?我调试了一些调用,所有对 SimpleJPARepository 的调用都连接了 4 个拦截器。其中之一是 TransactionInterceptor。有没有办法告诉 Spring 数据不要连接拦截器?


我最后做的是实现一个 NullTransactionManager。基本上,一个什么都不做的事务管理器……只是给 Spring Data 一些东西来咀嚼。有没有更好的办法?我宁愿告诉创建存储库的工厂不要连接拦截器。

public class NullTransactionManager implements PlatformTransactionManager
{
public NullTransactionManager()
{
super();
}

public TransactionStatus getTransaction(TransactionDefinition pDefinition) throws TransactionException
{
// return a transaction status that doesn't do antyhing
return new TransactionStatus() {
public boolean isNewTransaction()
{
return false;
}

public boolean hasSavepoint()
{
return false;
}

public void setRollbackOnly()
{
}

public boolean isRollbackOnly()
{
return false;
}

public void flush()
{
}

public boolean isCompleted()
{
return false;
}

public Object createSavepoint()
{
return null;
}

public void rollbackToSavepoint(Object pSavepoint)
{
}

public void releaseSavepoint(Object pSavepoint)
{
}
};
}

public void commit(TransactionStatus pStatus) throws TransactionException
{
//do nothing
}

public void rollback(TransactionStatus pStatus) throws TransactionException
{
//do nothing
}
}

最佳答案

根据定义,您不能在没有事务的情况下通过 JPA 保留对象。规范的第 7.9.1 节明确指出 EntityManager.persist(…)….merge(…) 等方法需要正在进行的事务。

关于java - 你如何在没有事务的情况下使用 Spring Data JPA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24494964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com