@ElementCollection get collection throw error' org.hibernate.LazyInitializationException'

时间:2017-03-29 04:37:07

标签: java hibernate

我有实体

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.

2 个答案:

答案 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传递给线程,在新线程中创建一个事务并获取所需的数据。