我有实体
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
Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception.
答案 0 :(得分:0)
我通过以下方式解决了设置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;
有关更多信息,请参见this。
但是请注意,您可能遇到here所述的性能问题。
答案 1 :(得分:-1)
这是一种错误的模式。您希望将获取的实体保留在该线程中,否则您将遇到问题。这是因为底层的Hibernate Session
对象不是线程安全的,因此当你创建一个新线程时,没有任何会话。
将根实体的id传递给线程,在新线程中创建一个事务并获取所需的数据。