![](/img/trans.png)
[英]org.hibernate.LazyInitializationException associated collection
[英]@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));
有时我会在msisdns
中msisdns
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.