我在调试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或类似的东西吗?或者我需要通过配置或在代码中更改一些东西来修复这个问题?
谢谢.
1条答案
按热度按时间daupos2t1#
我假设你有一个自动生成的
toString()
实现?一般来说,你应该避免在
toString()
、equals()
、hashCode()
等中引用惰性加载的属性。如果不这样做,就会导致LazyInitializationException
的意外,就像你所面临的一样,每当前面提到的方法试图访问活动事务上下文之外的惰性属性时,就会触发这些意外。(This确实是“intellij的东西”,在这个意义上,尽管调试的代码可能被一个事务包围,但Intellij检查器在一个单独的线程上评估表达式,其中没有活动的事务=没有持久化上下文打开。此外,它只会发生在
@XxxToOne(optional = false)
属性上)