繁体   English   中英

Spring MVC + Hibernate具有双向关系

[英]Spring MVC + Hibernate with bidirectional relationship

我一直在使用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 ,则计算机将@ManyToOne ,因为它将从主题转到评论再返回主题,反复地,永不停止。

因此,你们建议将主题作为响应正文返回。

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

但是首先,使用双向关系的原因可以在这里找到。

我的解决方案是使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM