繁体   English   中英

@ElementCollection 获取集合抛出错误 'org.hibernate.LazyInitializationException'

[英]@ElementCollection get collection throw error 'org.hibernate.LazyInitializationException'

我有实体

public class SmsSending implements Serializable {
....

    @ElementCollection
    @CollectionTable(name = "sms_msisdns", joinColumns = @JoinColumn(name = "sms_sending_id"))
    @Column(name = "msisdns")
    private Set<String> msisdns;

在主线程中,我得到Set<String> msisdns = smsSending.getMsisdns(); 并传递给新线程。

executor.submit(new Thread(() -> start(msisdns));

有时我会在msisdnsmsisdns

Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception.

我通过这种方式设置 EAGER FetchType 策略解决了这个问题:

public class SmsSending implements Serializable {
....

@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "sms_msisdns", joinColumns = @JoinColumn(name = "sms_sending_id"))
@Column(name = "msisdns")
private Set<String> msisdns;

有关更多信息,请参阅

但请注意,您可能会遇到此处所述的性能问题。

这是错误的模式。 您希望将获取的实体保留在该线程中,否则会遇到您提到的问题。 这是因为底层的 Hibernate Session对象不是线程安全的,因此当您创建新线程时,没有任何会话。

将根实体的 id 传递给线程,在新线程内进行事务并获取所需的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM