HibernateProxy.toString惰性初始化

时间:2020-07-24 21:42:48

标签: java hibernate jpa spring-data-jpa

在调试POC时出现奇怪的错误。 我有2个实体:

@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;

@Getter
@Setter
@Entity
@Table(name = "APPLICATION")
public class ApplicationEntity implements Serializable{

    private static final long serialVersionUID = 7300036359295729197L;

    @Id
    @Column(name = "APPLICATION_ID")
    private String id;

    @OneToOne(mappedBy = "applicationEntity", fetch = FetchType.LAZY)
    private Applicant applicant;

这些类具有从CrudRepository扩展的存储库接口,在Applicant存储库中,我有一个自定义方法来获取带有applicationId的实体: Applicant findByApplicationId(String applicationId); 但是,在调试时,我在applicationEntity属性的intellij调试器中看到以下消息:

Method threw 'org.hibernate.LazyInitializationException' exception. Cannot evaluate org.example.postgres.jpa.model.ApplicationEntity$HibernateProxy$qa4PKx8V.toString()

每次执行新测试时,值qa4PKx8V都会改变。

我在@Join批注中尝试了很多组合,删除了lombook批注,或者使用了@Transactional批注,但始终是相同的错误。

要注意的关键一点是,我可以从表中获取任何错误的数据,我只是在调试器中看到此消息,所以我的问题是,这是intellij还是类似的东西?还是我需要通过配置或更改代码中的代码来解决此问题?

谢谢。

1 个答案:

答案 0 :(得分:0)

我假设您有一个自动生成的toString()实现?

通常,您应该避免引用toString()equals()hashCode()等中的延迟加载属性。否则,将导致LazyInitializationException这样的意外每当上述方法尝试在活动事务上下文之外访问懒惰属性时,您就会面对这些错误。

(这确实是'intellij的事情',在某种意义上,尽管调试的代码可能被事务包围,但是Intellij检查器在没有事务处于活动状态=没有打开持久性上下文的单独线程上评估表达式。 。而且,只有@XxxToOne(optional = false)属性会发生这种情况)