2017-09-15 181 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打开任何提示。

感谢 格雷戈尔