我有以下情况。我在spring使用JPA:
@Autowired
SampleService service;
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void PerformLogic(LogicData data) throws SIASFaultMessage
{
SampleObject so = createSampleObject();
try{
.//do some logic to persist things in data
.
.
persistData(data);
.
.
.
updateSampleObject(so);
}
catch(Exception){
updateSampleObject(so);
throw new SIASFaultMessage();
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public createSampleObject()
{
SampleObject so = new SampleObject();
.
.//initialize so
.
service.persist(so);
return so;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public updateSampleObject(SampleObject so)
{
service.persist(so);
return so;
}
当一切正常时,数据可以毫无问题地保存在数据库中。但是,当引发异常时,我需要方法 updateSampleObject(so)
将信息保留在数据库中。这不是正在发生的事情。如果抛出异常,方法 updateSampleObject也 将回滚,这不是我所需要的。我需要这两个方法(
createSampleObject 和 updateSampleObject )始终保持持久,无论是否引发异常。我该如何实现?
而且,如果我用以下方法 注释 方法 createSampleObject 和 updateSampleObject :
@Transactional(propagation = Propagation.NEVER)
想法是抛出异常,而我没有抛出异常。问题出在哪里?分析日志,我看到以下行:
org.springframework.orm.jpa.JpaTransactionManager ==> Creating new transaction with name [com.test.PerformLogic]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT....
这表示已创建此事务,但我看不到其他事务的任何提示。
这是我的Spring配置文件中有关事务的一部分
<bean id="myDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="packagesToScan" value="cu.jpa"/>
<property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">${hdm2ddl.auto}</prop>
</props>
</property>
<property value="/META-INF/jpa-persistence.xml" name="persistenceXmlLocation"/>
<property name="persistenceUnitName" value="jpaPersistenceUnit"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="nestedTransactionAllowed" value="true" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
spring交易是基于代理的。因此,这是当bean A引起bean
B事务时它如何工作的。A实际上具有对代理的引用,该代理委托给beanB。此代理是启动和提交/回滚事务的代理:
A ---> proxy ---> B
在您的代码中,A的事务方法调用了A的另一个事务方法。因此Spring无法拦截该调用并开始新的事务。这是一个常规方法调用,不涉及任何代理。
因此,如果要启动新事务,则该方法createSampleObject()
应该在另一个bean中,并注入到当前bean中。
在文档中对此进行了更详细的说明。
我在 RabbitMQ 中创建新队列时遇到了一些问题。我只创建一个使用者客户端,该客户端将使用来自另一个微服务的消息。 这是我到目前为止所做的。 应用程序属性: 配置类: 和侦听器类: 当我运行这个程序时,我有一条ACCESS_REFUSED消息,但我不知道为什么。我错过了什么吗?? 谢谢
问题内容: 由于某些原因,我已经使用Spring PlatformTransactionManager手动执行了事务提交和回滚操作,我需要做的是设置一个钩子,以便在事务提交后执行后提交操作。 通过查看: 我没有看到我能确定交易是否成功,除了假设它没有假想。 而且我可以将AOP作为一种选择,但是以编程方式进行操作,也许使用回调方法呢? 问题答案: 你可以得到你想要什么以更简单的方式,和 使用,您可以
这意味着没有为内部 我找不出这里出了什么问题?非常感谢任何帮助。
我是Spring Data的新手,并试图通过关注这篇关于SO和其他一些教程的帖子来解决这个问题,但没有取得太大成功。 我正在尝试在 2 个表之间使用 Spring Data JPA 进行简单的连接。数据库中的表称为: * user_vehicle - user_vehicle表中数据库中的当前数据: ID|vehicle_ID|user_ID 1|1|1 2|2|1 这是我尝试过但无法让它工作的代
我正在尝试使用JPA生成表。但我不能创造它。代码中没有错误,但似乎存在配置错误。但我找不到它,我尝试了很多配置但没有发生。多谢. 这是: } pom.xml
我正在使用Spring靴2 /飞行路线/后退设置。 我想让Flyway创建一个表,其中包含自动键迭代的序列。JPA应该识别序列并使用它。 我让Flyway执行PostgreSQL脚本: 这是实体定义: 启动时抛出以下错误: 我的解释是Flyway成功执行了脚本并创建了一个序列。但是JPA想在之后创建序列并失败,因为它已经存在。如果我错了,请纠正我。 现在,如果可能的话,我如何配置JPA以重用现有序