我有一个带有derby数据库的应用程序,并使用eclipselink作为持久性api。 说我有一个gui列表的团队。每支球队都有很多球员。团队类中的关系如下所示:
@OneToMany(mappedBy = "team", fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
private List<player> players = new ArrayList<player>():
和这样的玩家类:
@ManyToOne(targetEntity = Team.class)
@JoinColumn(name = "teamID", nullable = false, referencedColumnName = "ID")
private Team team;
所以我现在开始申请,并填写所有现有团队的名单:
public List<Team> getTeams()
{
TypedQuery<Team> query = em.createQuery("SELECT t FROM Team t", Team.class);
List<Team> teams = query.getResultList();
return teams;
}
到目前为止一切正常,只有球队被加载,而不是球员。假设我现在通过选择一个团队并为此命令执行命令,与团队的玩家打开一张桌子。该表填充了:
team.getPlayers();
所以现在这支球队的所有球员都被加载了,因为他们现在需要了。 但是在我关闭桌子之后他们仍然被加载,但是我想再次“卸载”它们以便它们不会留在记忆中 - 我将如何做到这一点?
答案 0 :(得分:1)
如果您想从其上下文中删除托管实体,可以调用EntityManager.clear()
方法(之前调用EntityManager.flush()
)。但是,此操作会删除所有托管实体,这不一定是您想要的,因为这可能会导致额外的数据库命中。
如果你很幸运并且你可以使用JPA 2.0,那么有一个更好的选择:EntityManager.detach(Object)
方法,它从持久化上下文中删除给定的对象。