当前位置: 首页 > 知识库问答 >
问题:

Spring数据和玩框架,Spring不创造新的交易

佴博实
2023-03-14

在我的项目中,我得到了类类别(仅重要部分代码):

class Category {
  @LazyCollection(LazyCollectionOption.EXTRA)
  @ManyToMany(mappedBy = "categories", cascade = CascadeType.REMOVE)
  private Set<Entity> entities = new HashSet<Entity>();
  /*.rest of code not necessary.*/
}

以及与多对多相关的另一类:

class Entity {
  @LazyCollection(LazyCollectionOption.EXTRA)
  @ManyToMany(cascade = CascadeType.REMOVE)
  private Set<Category> categories;
  /*.rest of code not necessary.*/
}

我有一个Categories控制器,我从其中调用方法delete。类声明如下所示:

@Named
@Component
@Singleton
public class Categories extends Controller {

这是我的控制器中的方法:

public Result delete(Long id) {
  categoriesService.delete(id);
  return ok();
}

我的categoryServiceImpl声明如下:

@Named
@Component
@Singleton
public class CategoriesServiceImpl implements CategoriesService {

以及没有事务的服务中的删除方法:

public void delete(Long id) {
  Category category = findById(id);
  boolean inTransaction = TransactionSynchronizationManager.isActualTransactionActive();

  Logger.info("Am I in transaction" + inTransaction);

  /* Exception while trying to access category.getEntities() */ 
  for(Entity entity : category.getEntities()) {
    entity.getCategories().remove(category);
    entityService.update(entity);
  }

  category.getEntities().clear();
  repo.delete(category);
}

我在尝试访问service delete方法中的category.getEntities()时遇到异常:

LazyInitializationException: failed to lazily initialize a collection of role: models.Category.entities, could not initialize proxy - no Session]

我知道这是因为这个方法中没有事务。但是当我尝试将事务强制到我的服务方法上时,如下所示:

@Transactional(propagation = Propagation.MANDATORY)
public void delete(Long id) {

或者@Transactional(propagation=propagation.REQUIRES_NEW)或任何一个传播枚举,我仍然无法在该方法中获得事务。

我做错了什么?我该怎么解决呢?通过任何方式,重构代码,另一种方法或任何想到的?

共有1个答案

谢财
2023-03-14

尝试使用

public void delete(Long id) {
   Category category = findById(id);
   Hibernate.initialize(category.brands);
   boolean inTransaction = TransactionSynchronizationManager.isActualTransactionActive();
   //Remaining Code Here

}
 类似资料:
  • 问题内容: 我正在使用Play!框架2.0,我陷入了涉及数据库的烦人问题。 假设我有一个(延伸它有几个属性)类(,,,等)。 在某个时候,我想添加一个新属性,可以说(它到底是什么并不重要)。因此,我将属性添加到类中,进行编译和运行。 问题是:我收到有关数据库更改的红色警报(很明显),它要求我按 “ APPLIC CHANGES” (如果我没记错的话)。很好,但是! 所有数据库记录都被删除 ! 结论

  • 这些是以下类别: 在控制器文件中,我有以下文件 列表getQuestion()中的size()引发LazyInitializationException,因为没有打开的会话 我知道,将fetch类型更改为EAGER或在QuestionRepository中的函数定义上方使用JPQL查询可能会解决这个问题,但在我的应用程序中,有些地方没有帮助,我需要延迟fetch。 如何使get问题()函数中的整个

  • 数据库是整个站点的数据储藏室。用户提交的数据可以存储在数据库中,以便未来使用。Play可以通过JDBC和数据库通信。我讲介绍Play和mysql数据库的连接。 Play 2.*版本的默认操作数据库的方式是通过Ebean。Play提供Finder这一帮助类型,可以实现一些简单的数据库查询。 数据库准备 在mysql中增加数据库testing。增加用户"player",密码为"player"。为用户p

  • 这一章主要提供Spring框架新的功能和变更。 升级到新版本的框架可以参考。Spring git。 内容列表 Spring 5.x框架新的功能 Spring 4.x框架新的功能 Spring 3.x框架新的功能 Spring FrameWork 5.0新的功能 JDK 8+和Java EE7+以上版本 整个框架的代码基于java8 通过使用泛型等特性提高可读性 对java8提高直接的代码支撑 运行

  • 问题内容: 我已经开发了一个Spring / JPA应用程序: 服务,存储库和域层即将完成 。 该 所缺的只是层是网络层 。我正在考虑将Playframework 2.0用于Web层,但不确定是否可以 在Playframework 2.0类中注入/使用spring bean 。 这可能吗?如果可以,怎么办? 问题答案: 您可以。已针对Play 2.5.x更新: https://github.com

  • 从戏剧!框架文档: Play2.0中没有内置的JPA实现;您可以选择任何可用的实现。例如,要使用Hibernate,只需将依赖项添加到项目中: 我的选择是什么而不是冬眠? 你认为什么最适合留言板网站? 我知道Hibernate有一点开销,对吗?