“卸载”延迟加载的实体

时间:2012-05-19 17:27:05

标签: database jpa lazy-loading

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

所以现在这支球队的所有球员都被加载了,因为他们现在需要了。 但是在我关闭桌子之后他们仍然被加载,但是我想再次“卸载”它们以便它们不会留在记忆中 - 我将如何做到这一点?

1 个答案:

答案 0 :(得分:1)

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

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