1

我有一个带有 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();

所以现在这支球队的所有球员都加载了,因为现在需要他们。但是在我关闭表格后,它们仍然处于加载状态,但我想再次“卸载”它们,这样它们就不会留在内存中——我该怎么做?

4

1 回答 1

1

如果您想从其上下文中摆脱托管实体,您可以调用EntityManager.clear()方法(EntityManager.flush()之前调用)。但是,此操作会删除所有托管实体,这不一定是您想要的,因为这可能会导致额外的数据库命中。

如果你很幸运并且可以使用 JPA 2.0,那么还有一个更好的选择:EntityManager.detach(Object)方法,它从持久性上下文中删除给定的对象。

于 2012-05-19T21:48:25.663 回答