谁能帮我如何处理@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()返回一个合并的对象。但是,旧的仍然是独立的,因此请记住访问合并的旧的。