gpt4 book ai didi

java - 事务方法抛出 "no transactional entityManager available"

转载 作者:太空宇宙 更新时间:2023-11-04 13:26:37 25 4
gpt4 key购买 nike

我有一个定义为@transactional的方法。事实上,我有一个方法调用一个方法,该方法调用一个方法,并且所有三个都是@transactional。事务逻辑工作得很好,直到我将一些方法提取到一个抽象类中以进行某些代码重用,这似乎以某种方式破坏了我的逻辑。

事务方法来自一个抽象类,这里是相关部分的部分片段(我必须手动重写它,所以请原谅我的拼写错误):

public abstract class ReadWriteService<ReadEntityTempalte extends IEntity, WriteEntityTemplate extends IEntity>

//extends jpaRepository, created using @enableJpaRepositories
private searchRepository<WriteEntityTemplate, String> writeRepository;

@PersistenceContext
private EntityManager em;

@transactional
public ReadEntityTemplate save(final WriteEntityTemplate entity){

if(entity == null) return null;

WriteEntityTemplate returnValue = writeRepository_.save(entity);

postSave(returnValue); //checks our security logic

flush();

ReadEntityTemplate returnEntity = find(returnValue.getId());

//required to detect changes made to the view by our save
em.refresh(returnEntity);

}

这样写是因为我们使用的是 View ,因此可以在 View 的 find() 中修改返回值。这种逻辑在过去有效,并且仍然适用于许多调用。

失败的方法是:

 @Override
@transational

public void configure(EntityFileConfig config) throws ClassNotFoundException{

//load config from file

for(EntityConfig entityConfig: entityConfigs){

EntityType entityType=EntityTypeService_.find(entityConfig.getKey());

if(entityType==null){
entityType = EntityType.createByRequiredFields(entityConfig.getKey());
}

//update entityType to reflect config file.

entityType = entityTypeService_.save(entityType);

for(String permissionName: entityConfig.getPermissions()){
if(!entityTypeService_.hasPermission(entityType, permissionName)){

Permission permission = permissionSetup.getPermission(permissionName);

if(permission!=null)
//fails on below lines
permissionService._.addPermission(entityType, permission);

}
}
}
}

entityTypeService 和 PermissionService 都扩展了上面的抽象类,并使用相同的 save 方法,无需更改,addPermissions 是一个 forloop,对每个权限调用 save。

entityTypeService 可以工作,但permissionService 失败。当调用权限服务时,如果我执行 em.isTransactionalEntity,它会返回 false。

所有 @transactional 注释都使用 spring 注释,而不是 javax 注释。

实际上,似乎有些权限会保存,而其他权限则不会,几乎就好像它是不确定的,但这可能很简单,因为修改了已经设置了一些值的数据库文件,因此不需要在第一次运行一些逻辑。

我已经做了很多绊脚石,但还没有更接近确定什么会导致我的交易结束。我曾以为可能是@persistenceContext,因为JPARepos通过不同的方法获取它们的entityManager,然后使用@persistenceContext Autowiring ,但如果是这样的话,一切都会失败?

任何帮助将不胜感激,我对这个问题的原因感到非常困惑。

最佳答案

假设您已在 @Configuration 类上启用 @EnableTransactionManagement

由于您没有在 @Transaction 上设置任何传播,因此默认值为 Required。这意味着所有方法都必须是事务的一部分。由于您的抽象方法之一不是 @Transactional 的一部分,因此会出现错误。

enter image description here

For more information on Spring Transactions .

注意:图片取自上面的链接。

关于java - 事务方法抛出 "no transactional entityManager available",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32587738/

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