- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 JPA 实体上从 EAGER 获取切换到 LAZY 获取,但随后出现错误。我已经尝试了很多解决方案,并且一直在寻找有效的解决方案 - 找不到任何适用于 Google 的解决方案...而且我也不希望该实体加入 fetch。
错误:org.hibernate.LazyInitializationException:无法延迟初始化角色集合:package.User.wallets,无法初始化代理 - 无 session
网络 Controller 文件:
@Controller
public class AppController {
@GetMapping("app/")
public ModelAndView app() {
ModelAndView mv = new ModelAndView();
mv.setViewName("app/index");
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
List<Wallet> wallets = user.getWallets(); // error on this line
mv.addObject("wallets", wallets);
return mv;
}
}
用户文件:
@Entity
public class User {
@Id
@GeneratedValue
@Type(type="uuid-char")
private UUID id;
@Column(nullable = false)
private String email;
@Column(nullable = false)
private String firstName;
@Column(nullable = false)
private String lastName;
@Column(nullable = false)
private String password;
// FetchType.EAGER solves the error, but I can't have EAGER due to performance issues.
@OneToMany(mappedBy="user", fetch = FetchType.LAZY)
@Fetch(value = FetchMode.SUBSELECT)
private List<Wallet> wallets;
// ** getters and setters **
}
@Repository
public interface UserRepo extends JpaRepository<User, UUID> {
Optional<User> findByEmail(String email);
}
钱包文件:
@Entity
public class Wallet {
@Id
@GeneratedValue
@Type(type="uuid-char")
private UUID id;
@ManyToOne
@JoinColumn(name="user_id", nullable=false)
private User user;
@OneToOne
@JoinColumn(name="currency_id", nullable=false)
private Currency currency;
@Column(nullable = false)
private double balance;
// ** getters and setters **
}
@Repository
public interface WalletRepo extends JpaRepository<Wallet, UUID> {
Optional<Wallet> findByUserAndCurrency(User user, Currency currency);
}
感谢您阅读所有这些,我非常感谢您的回复。
最佳答案
问题的根源:
默认情况下,hibernate 延迟加载集合(关系),这意味着每当您在代码中使用集合时,hibernate 都会从数据库中获取集合,现在的问题是您正在 Controller 中获取集合(其中 JPA session 已关闭) )。这是导致异常的代码行(您正在加载评论集合):
List<Wallet> wallets = user.getWallets();
解决方案
您的用户实体中有此
@OneToMany(mappedBy="user", fetch = FetchType.LAZY)
@Fetch(value = FetchMode.SUBSELECT)
private List<Wallet> wallets;
用这个
@OneToMany(fetch = FetchType.EAGER, mappedBy = "user", cascade = CascadeType.ALL)
private List<Wallet> wallets;
Collections are lazy-loaded by default
更新的解决方案
这种特殊情况可以通过在 User
中添加 toString() 来重新定义 Lombok toString() 来解决
保留您的fetchType.LAZY
而不是fetchType.EAGER
并且将 toString 方法添加到您的用户实体
@Override
public String toString() {
return "User [id=" + id + ", email=" + email+ ", firstName=" + firstName+ ", lastName=" + lastName + ", password=" + password+ "]";
}
并向您添加钱包实体:
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="user_id", nullable=false)
private User user;
尝试将 @Transactional
添加到您的 Controller
关于java - Spring 中的 LazyInitializationException 与 JPA 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58991466/
我开始学习使用 Hibernate 来开发 Java 中的 Web 系统,但我在类的映射和使用方面遇到了一些问题。 我有两个表:tblusuario和tblperfilusuario,tblusuar
我正在开发一个部署在 Tomcat 上的 J2EE 服务器应用程序。我使用 Spring 源作为 MVC 框架,使用 Hibernate 作为 ORM 提供者。我的对象模型有很多惰性关系(根据请求获取
我在尝试访问 permissions 时遇到 LazyInitializationException我的 Collection User目的。异常信息: org.hibernate.LazyIniti
我在我们的生产网络服务器上收到以下错误: NHibernate.LazyInitializationException : Initializing[Domain.Entities.AudienceT
这是一个让我困惑的问题。我正在尝试实现基本的 Hibernate DAO 结构,但遇到了问题。 这是基本代码: int startingCount = sfdao.count(); sfdao.cre
我看到类似的问题已经发布过,但是标准建议的解决方案似乎不适用于我,我想了解原因。 我有一个非常活跃的Grails 2.2.5应用程序,而且我一直在调查涉及大量数据集的报告问题。所讨论的域类是Polic
嗨,我有使用 jhipster 4.2.0 的微服务应用程序这是我的资源类 import org.springframework.web.bind.annotation.*; import javax
我有一个 Patient 类,其中包含 Id 集合和文件夹集合。当我尝试单独保存文件夹时,由于患者的 id 集合,它会抛出 LazyInitializationException。 患者类别如下所示:
我正在使用 Hibernate 3.6.0 制作一个应用程序,但出现了 LazyInitializationException。我没能解决这个问题,所以我来这里寻求你的帮助。 这是堆栈跟踪: Exce
在将域对象从数据库转换为客户端的资源对象期间,我遇到延迟加载字段的问题。 Customer :使用惰性字段从数据库加载实体 FullCustomer :将发送给客户端的实体。 服务层: @Transa
我有一个问题。我在 grails 中有事务性服务: class MyService { static transactional = true Set getFurniture(Long
我有一些具有两种关系的模型: @Entity @Table(name = "data_model") public class DataModel { @Id @GeneratedVa
传统上,我们会尝试避免 LazyInitializationException。但是,我需要暂时允许它们被抛出。这是我想要做的伪代码: Session session = ...; Customer
我正在将 Hibernate 4 用于 Java 项目。 我有下一个包含两个实体的方案: Units *has many* Users 因此,单位拥有用户的外键(请参阅 table definitio
JPA session 在静态方法中的行为如何?我使用 Hibernate 从数据库中检索对象列表,然后使用 Guava 的静态 Lists.transform 方法对其进行转换,这会导致: org.
我有这样的 OmQcActivity 类: @Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @Table(name="OM_QC
我的代码运行良好,但出现异常。将调用一个操作方法,但是在方法调用完成后我得到了这个异常。 我尝试了网络上所有可用的选项,但似乎没有什么能真正帮到我。 12/14 23:30:17 INFO er.S
目前我有一个子实体有一个 @ManyToOne关联到它的父实体。之前的开发者已经将这个字段设置为 lazy="false"在 session 关闭时也可以随时获取父级,但我决定它应该是 lazy="t
此代码的目的是允许用户检查 ID;在这种情况下,它将是检查特定运动比赛的 ID,以便查看相关比赛及其详细信息。这样做的全部目的是通知用户,如果他们输入了错误的 ID,我只是想在 SOAP 请求中生成一
尝试从数据库获取某些对象时,我不断收到错误: org.hibernate.LazyInitializationException (LazyInitializationException.java:1
我是一名优秀的程序员,十分优秀!