簡體   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