谁能帮我如何处理@Any关系?

我有一个InteractionParticipate接口(interface),每个想参与某种消息交互的人都可以实现。消息由InteractionMessage表示,它具有发送器和接收器。由于我们不知道哪个实现InteractionParticipate的实体将成为消息的接收者(或发送者),因此我们必须使用@Any关系。

我读过this one,它启发了我,并在InteractionMessage中写了类似的内容:

@Any(metaColumn = @Column(name = "Transmitter_Type"))
@AnyMetaDef(
        idType = "long",
        metaType = "string",
        metaValues = {
                @MetaValue(value = "Applicant", targetEntity = Applicant.class),
                @MetaValue(value = "Vacancy", targetEntity = Vacancy.class)
        })
@JoinColumn(name = "Transmitter_Id")
@LazyToOne(LazyToOneOption.FALSE)
private InteractionParticipate transmitter;

@Any(metaColumn = @Column(name = "Receiver_Type"))
@AnyMetaDef(idType = "long", metaType = "string",
        metaValues = {
                @MetaValue(targetEntity = Applicant.class, value = "Applicant"),
                @MetaValue(targetEntity = Vacancy.class, value = "Vacancy")
        })
@JoinColumn(name = "Receiver_Id")
@LazyToOne(LazyToOneOption.FALSE)
private InteractionParticipate receiver;

数据库创建良好,我可以看到实体正确保存。但是当我尝试从数据库中获取InteractionMessage

InteractionMessage消息=(InteractionMessage)session.get(InteractionMessage.class,id);

我面对我既无法获得receiver也无法获得transmitter的原因,因为方法引发了“org.hibernate.LazyInitializationException”异常。无法评估... Vacancy _ $$ _ javassist_49.toString()。 (空缺类正在实现InteractionParticipate。)

我试图玩@LazyToOne甚至@LazyCollection,但失败了。

请帮我弄清楚。提前致谢!

最佳答案

您正在尝试访问一个分离对象的集合。
分离的对象表示它未连接到 session 。结果,在访问惰性集合时,您会收到一个异常。
发生这种情况的原因可能不同。例如,您通过前端从序列化接收对象。
根据需要的结果,有2种可能的解决方案。

1)您可以定义要热切获取的集合。这意味着,集合在父对象初始化后即被初始化。
2)您可以合并对象(T mergedObject em.merge(detachedObject);)以访问其集合。

一个小警告:em.merge()返回一个合并的对象。但是,旧的仍然是独立的,因此请记住访问合并的旧的。

09-28 04:25