2017-09-15 169 views
0

這是一個永無止境的故事:)JPA一對多的關係問題

我看了很多帖子和文檔的這個話題,我還是真的不明白髮生了什麼那裏。

我有一個孩子:

@Entity 
public class Offer implements Serializable { 
... 
    @JsonManagedReference 
    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.REFRESH}) 
    @JoinColumn(nullable = false, name = "provider_id") 
    private Provider provider; 

和家長:

@Entity 
public class Provider implements Serializable { 
... 
    @JsonBackReference 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "provider") 
    private List<Offer> offers; 

如果我把它providerRep.findAll()導致死循環。

如果我刪除mappedBy="provider"它的工作原理。但我不能保存優惠作爲提供者的孩子。

如何配置它正確? (無環)

我如何保存收購建議提供直的孩子,而無需將其添加到供應商並保存提供者...(它甚至有可能?)

的工作流程很容易: 我創造&保存提供者。然後爲提供商節省大量優惠。所以沒有cascading.PERSIST是必要的。

希望你能幫助我理解我的問題。特別是這個「mappedBy」和JoinColumn點讓我困惑。

編輯:

上調用offerRepo.getOne():

2017-09-15 10:56:23.357 WARN 14128 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : 
Failed to write HTTP message: org.springframework.http.converter.Http 
MessageNotWritableException: 
Could not write JSON: 
Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: 
Infinite recursion (StackOverflowError) (through reference chain: de.gaudiamo.content.entities.Provider_$$_jvstc64_7["offers"]->org.hibernate.collection.internal.PersistentBag 
+0

一個「死循環」,你不顯示。在JSON中?或在JPA?因爲它們是完全不同的API。 – DN1

+0

在JSON(傑克遜)。我所看到的是無盡的堆棧。 –

+0

...'at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25)〜[jackson-databind-2.8.9.jar:2.8.9] at com.fasterxml。傑克遜數據綁定-2.8.9.jar:2.8.9]等 –

回答

0

嘗試改變@JsonBackReference到@JsonIgnore

+0

同樣的結果。它也讓我困惑。同時我刪除了所有其他值(只是ID和關係。 –

0

OK ..我找到某種解決方案。意見歡迎!

安裝孩子:

public class Offer implements Serializable { 
.. 
    @JsonBackReference 
    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.REFRESH}) 
    @JoinColumn(nullable = false, name = "provider_id") 
    private Provider provider; 

和家長:

public class Provider implements Serializable { 
... 
    @JsonManagedReference 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "provider", cascade = {CascadeType.MERGE, CascadeType.REFRESH}) //mappedBy= referenz attribute name in Offer 
    private List<Offer> offers; 

和POM:

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-core</artifactId> 
      <version>2.9.1</version> 
     </dependency> 

!請注意,我在小孩和家長中切換了@JsonManagedReference@JsonBackReference! (我仍然不確定這個符號是如何在引擎蓋下工作的)

Iam有點害怕我在稍後遇到幾個問題。Iam打開任何提示。

感謝 格雷戈爾