Spring MVC + Hibernate具有双向关系

时间:2015-12-28 02:35:04

标签: java spring hibernate rest spring-mvc

我一直在使用Spring MVC + Hibernate + MySQL构建的RESTful服务。

在数据库中,我有两个表 - 主题和评论。主题表的ID列是注释表的外键。我使用Hibernate Tools生成模型和DAO:

主题模型:

...

@OneToMany(fetch = FetchType.LAZY, mappedBy = "topic")
public Set<Comment> getComments() {
    return this.comments;
}

...

评论模型:

...

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "topic_id", nullable = false)
public Topic getTopic() {
    return this.topic;
}

...

问题就出现了。我可以使用findById()获取分离的主题对象 DT 。但是,每次我想将 DT 作为响应主体发送到前端时,都会抛出“无会话”异常,因为LAZY对象 - 注释只能在会话中访问。

1)如果我没有更改为EAGER,我的解决方案是创建新的Topic对象 NT 并从中检索值(注释除外) DT 即可。然后返回 NT 作为响应正文。这是最好的做法吗?

2)如果我将@OneToMany部分更改为EAGER,问题仍未解决。因为当我发送 DT 时,会包含一组注释,并且每个注释都与@ManyToOne声明的主题有关。所以仍然会抛出“没有会话”的异常。

3)如果我将@OneToMany@ManyToOne同时更改为EAGER,计算机将会停留,因为它会从主题转到评论并回到主题,迭代,永不停止。

那么,你们如何建议将主题作为回应主体返回。

1 个答案:

答案 0 :(得分:0)

经过长时间的研究,我终于有了可以接受的解决方案。

但首先,可以找到使用双向关系的原因here

我的解决方案是使用jackson-datatype-hibernate,感谢@ZeeMesi。以下是步骤:

第1步:依赖

    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-hibernate4</artifactId>
        <version>2.6.4</version>
    </dependency>

第2步:春季背景

<mvc:annotation-driven>
    <mvc:message-converters>
        <!-- Use the HibernateAware mapper instead of the default -->
        <beans:bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <beans:property name="objectMapper">
                <beans:bean class="com.hersbitcloud.cancercloud.HibernateAwareObjectMapper" />
            </beans:property>
        </beans:bean>
    </mvc:message-converters>
</mvc:annotation-driven>

第3步:创建新类

公共类HibernateAwareObjectMapper扩展了ObjectMapper {

public HibernateAwareObjectMapper() {
    Hibernate4Module hm = new Hibernate4Module();
    registerModule(hm);
}

然后所有延迟取出的对象都是null