Hibernate:双向ManyToOne映射 - 反向关系不起作用

时间:2017-08-28 07:46:06

标签: java hibernate jpa many-to-one bidirectional

我在创建两个域类的双向映射时遇到问题。

我的UserAccount.java有很多AccountTransactions。在AccountTransaction域对象中,有一个带有外键的user_account_id列。

我已按以下方式设置映射:

UserAccount.java

// Other properties 

@ManyToOne(optional = false)
@JoinColumn(name = "user_account_id")
@NotNull
private UserAccount userAccount;

// Getters and setters...

AccountTransaction.java

@OneToMany(cascade=CascadeType.ALL, mappedBy="userAccount")
public List<AccountTransaction> accountTransactions;

场景是我希望获得所有userAccounts的列表及其对应的accountTransactions作为JSON数组,但是accountTransactions对象始终为null。

我也尝试过在存储库中修改过的Query:

@Query("SELECT account FROM UserAccount account JOIN FETCH account.accountTransactions WHERE account.user = :systemUser AND account.adminAccount = TRUE")
List<UserAccount> findAllAdminAccountWithTransactions(@Param("systemUser") User systemUser);

当我通过此查询检索值时,它首先在存储库中正确返回所有内容。但它引发了一个例外:

c.d.c.w.rest.errors.ExceptionTranslator  : An unexpected error occurred: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: com.david.coinlender.domain.UserAccount["accountTransactions"]->org.hibernate.collection.internal.PersistentBag[0]->com.david.coinlender.domain.AccountTransaction["userAccount"]

我似乎在某个地方有一个无限循环。有人可以指点我解决方案吗?

2 个答案:

答案 0 :(得分:1)

由于这是一个双向关系,jackson将尝试从其他部分序列化关系的每个部分,所以是的,你将有无限递归,为了避免这种情况,你需要通过停止序列化关系的一侧来停止循环使用@JsonIgnore

function(min, max){
   if(this.width >= min){
      this.width = max;
   else{
      this.width = min;
   }
}

或者你可以寻求另一种解决方案,如果你需要序列化双方,检查这个post的解决方案,以保持双方序列化而无需无限递归

答案 1 :(得分:0)

@JsonIgnore可以帮助您打破'Infinete Recursion'错误。