jpa HibernateProxy.toString延迟初始化异常

gmxoilav  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(94)

我在调试POC时遇到了一个奇怪的错误。我有两个实体:

@Getter
@Setter
@Entity
@Table(name = "APPLICANT")
public class Applicant implements Serializable {

    private static final long serialVersionUID = 6060170457948717553L;

    @Id
    @Column(name = "applicant_id", insertable = false, nullable = false)
    private Long applicantId;

    @Column(name = "application_id", unique = true)
    private String applicationId;

    @OneToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "application_id", referencedColumnName = "application_id", insertable = 
    false, updatable = false)
    private ApplicationEntity applicationEntity;

个字符
这些类具有从CrudRepository扩展而来的存储库接口,在Applicant存储库中,我有一个自定义方法来获取applicationId为Applicant findByApplicationId(String applicationId);的实体。但是,在调试时,我在intellij调试器中看到了applicationEntity属性的以下消息:
Method threw 'org.hibernate.LazyInitializationException' exception. Cannot evaluate org.example.postgres.jpa.model.ApplicationEntity$HibernateProxy$qa4PKx8V.toString()
每次执行新的测试时,值qa4PKx8V都会发生变化。
我在@Join注解中尝试了很多组合,我删除了lombook注解,我也使用了@Transactional注解,但总是同样的错误。
需要注意的一个关键点是,我可以从表中获取任何错误的数据,我只是在调试器中看到了这个消息,所以我的问题是,这是一个intellij或类似的东西吗?或者我需要通过配置或在代码中更改一些东西来修复这个问题?
谢谢.

daupos2t

daupos2t1#

我假设你有一个自动生成的toString()实现?
一般来说,你应该避免在toString()equals()hashCode()等中引用惰性加载的属性。如果不这样做,就会导致LazyInitializationException的意外,就像你所面临的一样,每当前面提到的方法试图访问活动事务上下文之外的惰性属性时,就会触发这些意外。
(This确实是“intellij的东西”,在这个意义上,尽管调试的代码可能被一个事务包围,但Intellij检查器在一个单独的线程上评估表达式,其中没有活动的事务=没有持久化上下文打开。此外,它只会发生在@XxxToOne(optional = false)属性上)

相关问题