Hibernate - 简单查询延迟抓取

时间:2013-09-03 12:39:12

标签: java hibernate jpa playframework

我正在使用Play Framework with Hibernate和JPA。

我有一个简单的实体:

@Entity
public class Player extends Model {

    @Required
    public Long gold;
}

我想检索所有玩家,所以这是我使用Hibernate执行的查询:

select p from Player p

结果已存储在列表中:List<Player>当我想调试以查看列表中的内容时,我可以看到104个玩家,但只有列表中的5个第一个玩家才真正加载。其他玩家都是懒惰的:类名是Player_$$_javassist_22

我的问题是:为什么我的所有玩家都没有完全装满?为什么他们中的一些人很懒?我想让我所有的玩家都没有懒惰的加载,我该怎么办?

谢谢

3 个答案:

答案 0 :(得分:1)

在XML hibernate映射中,您只需编写:<class name="Player" lazy="false">...,这会导致您的玩家对象被急切地提取。

使用注释,您可以使用here

所述的@Proxy(lazy=false)执行相同操作

您可以找到here

的更多信息

答案 1 :(得分:0)

您可以在关联上使用@ManyToOne(fetch = FetchType.EAGER)来禁用延迟加载。

答案 2 :(得分:0)

首先让我们理解'javax.persistence.FetchType'的概念 假设您有两个实体'玩家''团队',因为它们之间的关系为@oneToMany

@Entity
@Table(name = "player")
public class Player extends Model {
    public Long gold;
    String name;    
}

@Entity
@Table(name = "team")
public class Team {
    @Column (name = "name") 
    public String name;

    @OneToMany(fetch = FetchType.LAZY,mappedBy="players")
    public List<Player> players;    
}

现在,当您从数据库加载 Team 时,JPA会为您加载名称字段。 但是玩家有两种选择:将其与其他字段一起加载 (即急切[FetchType.EAGER])或者在调用团队getPlayers()方法时按需加载(即懒惰[FetchType.LAZY])。

当一支球队有很多球员时,在不需要的时候加载所有球员是没有效率的。所以在这种情况下,您可以声明您希望玩家在实际需要时加载。这称为延迟加载。

因此FetchType适合您的问题取决于您。如果您真的想在加载团队时加载所有玩家,请使用FetchType.EAGER

希望这能解决你的问题......