JPA递归实体StackOverflowError

时间:2016-07-07 18:16:34

标签: jpa

我在Netbeans中从现有数据库表生成了一个User实体。该表有一个lastUpdatedByUser列,它是一个User实体。此数据库中的大多数表都具有lastUpdatedByUser列,并且针对这些实体的查询会正确地返回用户对象作为结果的一部分。

实施例。检索FROM ProductionTable WHERE date ='someDate'有一个lastUpdatedByUser对象,该对象显示上次更新表行的人员及其余用户属性。

如果在web-app中编辑了productionTable数据并提交了,我需要更新lastUpdatedByUser列。

Users userUpdating = usersService.selectUserEntityByUserId(userId);
Users userEntity = usersFacade.findSingleWithNamedQuery("Users.findByUserId", parameters);
SELECT u FROM Users u WHERE u.userId = :userId

返回一个User对象,该对象包含一个lastUpdatedByUser,它是一个User对象,包含一个lastUpdatedByUser,它是一个包含lastUpdatedByUser对象的User对象....(我不知道有多少个,有二十行这些添加向上)

我坚持这个

productionEntity.setLastUpdatedByUser(userUpdating);

我在更新实体的下一个请求中得到Json StackOverflowError

gson.toJson(updatedProductionEntity)

用户实体定义:

@OneToMany(mappedBy = "lastUpdatedByUser")
private Collection<Users> usersCollection;
@JoinColumn(name = "LastUpdatedByUser", referencedColumnName = "UserId")
@ManyToOne
private Users lastUpdatedByUser;
@OneToMany(mappedBy = "lastUpdatedByUser")
private Collection<Production> productionCollection;

如何编辑,以便我继续将用户对象作为其他实体(如Production)的一部分,但只有一个用户实体的lastUpdatedByUser对象?

感谢您的任何见解。

1 个答案:

答案 0 :(得分:0)

我猜这是我的问题:

@JoinColumn(name = "LastUpdatedByUser", referencedColumnName = "UserId")

因为我在Users表中找到了自己的UserId

的FK

爱重构

================================

从Users表中删除该FK并在Netbeans中重新生成实体

private Integer lastUpdatedByUser;
应该是这样的 而不是

private Users lastUpdatedByUser;

现在我可以将所有具有有效FK的实体编辑到Users表和代码中......

感谢收听。