我在创建两个域类的双向映射时遇到问题。
我的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"]
我似乎在某个地方有一个无限循环。有人可以指点我解决方案吗?
答案 0 :(得分:1)
由于这是一个双向关系,jackson将尝试从其他部分序列化关系的每个部分,所以是的,你将有无限递归,为了避免这种情况,你需要通过停止序列化关系的一侧来停止循环使用@JsonIgnore
function(min, max){
if(this.width >= min){
this.width = max;
else{
this.width = min;
}
}
或者你可以寻求另一种解决方案,如果你需要序列化双方,检查这个post的解决方案,以保持双方序列化而无需无限递归
答案 1 :(得分:0)
@JsonIgnore可以帮助您打破'Infinete Recursion'错误。