3

谁能帮我处理@Any人际关系?

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

我读过这本书,它启发了我并写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 message = (InteractionMessage) session.get(InteractionMessage.class, id);

我面对我既不能得到也不能得到receivertransmitter因为Method 抛出了 'org.hibernate.LazyInitializationException' 异常。无法评估... Vacancy_$$_javassist_49.toString()。(空缺班正在实施InteractionParticipate。)

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

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

4

1 回答 1

1

您正在尝试访问分离对象的集合。分离的对象意味着它没有连接到会话。因此,在访问惰性集合时,您会收到异常。这可能由于不同的原因而发生。例如,您通过序列化从前端接收对象。有 2 种可能的解决方案,具体取决于所需的结果。

1)您可以定义要急切获取的集合。这意味着一旦父对象被初始化,集合就会被初始化。2)你可以合并对象(T mergeObject em.merge(detachedObject);)一个访问它的集合。

一个小警告:em.merge() 返回一个合并的对象。但是,旧的仍然是分离的,所以记得访问合并的。

于 2013-01-07T00:47:39.737 回答