gpt4 book ai didi

java - 如何通过获取一些不受对象管理器管理的值来避免 NucleusUserException

转载 作者:行者123 更新时间:2023-12-02 12:00:59 24 4
gpt4 key购买 nike

我有需要的业务逻辑

1) 执行一些操作,例如计数或“查找字段大于 a 的前 1 个项目的 id”,即对实体 A 执行一些读取操作。计数或查找涉及超过 25 个项目,因此它会生成许多实体组被影响。2)然后对另一个实体B执行一些操作并持久化更改的实体3) 现在我更改了实体 A 的唯一对象并希望保留它

如果我不在我的方法上使用 Spring @Transactional,则在调用 3) 时,我会得到 id 为“A@someHash”的对象,该对象由不同的对象管理器管理。根据 System.out.println(NucleusJPAHelper.getObjectState(busRouteToCheck));对象处于持久状态

如果我使用 Spring @Transactional 覆盖整个方法,我会得到“在单个事务中打开了太多实体组”

我如何强制 1) 的结果不由对象管理器管理,以最终获得一些 Long 值并进行处理 3) 就像我第一次在我的方法中处理 A 一样。最后,我需要读取多个实体组的项目,并且在事务中只更新两个。

我试图解决的问题:1)将整个方法分成另外3个,其中2个没有@Transaction,1和3有@Transaction;在这里我仍然得到 NucleusUserException; 2)在相同的条件下,我尝试使用2个不同的事务管理器,首先调用只读调用(方法1),然后使用第二个调用(方法3)进行写入。

有没有明确的方法来管理对象管理器?

使用的依赖项是:

   <dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-api-jdo</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-api-jpa</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>com.google.appengine.orm</groupId>
<artifactId>datanucleus-appengine</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>3.1.1</version>
</dependency>

增强器插件是

  <plugin>
<groupId>org.datanucleus</groupId>
<artifactId>maven-datanucleus-plugin</artifactId>
<version>3.1.3</version>
<configuration>
<!-- Make sure this path contains your persistent classes! -->
<!--<mappingIncludes>**/domain/*.class</mappingIncludes>-->
<!--<persistenceUnitName>transactions-optional</persistenceUnitName>-->
<verbose>true</verbose>
<api>JPA</api>
<!--<mappingIncludes>com/appspot/Player.class</mappingIncludes>-->
<!--<metadataIncludes>com/appspot/Player.class</metadataIncludes>-->
<fork>false</fork>
</configuration>
<executions>
<execution>
<phase>process-classes</phase>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
<dependencies>
<!--<dependency>
<groupId>asm</groupId>
<artifactId>asm-commons</artifactId>
<version>3.3.1</version>
</dependency>-->
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-api-jpa</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-enhancer</artifactId>
<version>3.1.1</version>
</dependency>
</dependencies>
</plugin>

最佳答案

我不能说我对 google JPA 实现深处发生的事情有了详细的了解,并获得了我发布的异常。相反,我解决了我面临的全局问题。我相信如果处理异常,您也会面临同样的问题。我尝试解决更改事务中一些少量对象以及读取可能不需要事务的对象的限制(因为并非事务更新由于上述异常而失败)。

问题在架构上得到了解决:1)您应该在服务层中创建单独的方法来读取实体或获取计数,而不是使其成为事务性的2)在服务层中创建单独的方法以获取非事务性方法的结果作为参数并更新实体;使这些方法具有事务性 3) 在 Controller 层或 Controller 下方但服务上方的自定义层中分别调用这些方法!

我的错误是,我认为 Spring 的 @Transactional 注释是有意义的,即使从另一个没有 @Transactionl 的方法调用带有 @Transactional 的方法。这是错误的:由于注释的方面性质,只有从外部类对象调用方法时它们才有意义。因此,在我的示例中,我得到的整个调用位于唯一事务内(有太多实体异常(exception))或没有事务内(因此获取具有 id 的对象...由不同的对象管理器管理)。因此,将非事务行为和事务行为分离到不同的方法并从外部调用它们对我很有帮助。

关于java - 如何通过获取一些不受对象管理器管理的值来避免 NucleusUserException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47254374/

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