1

我正在使用带有 Hibernate 和 JPA 的 Play Framework。

我有一个简单的实体:

@Entity
public class Player extends Model {

    @Required
    public Long gold;
}

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

select p from Player p

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

我的问题是:为什么我的所有播放器都没有完全加载?为什么其中一些是懒惰的?我想在没有延迟获取的情况下加载我的所有播放器,我该怎么做?

谢谢

4

3 回答 3

1

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

使用注释,您可以按照此处@Proxy(lazy=false)所述执行相同操作

您可以在这里找到更多信息

于 2013-09-03T13:25:38.317 回答
0

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

于 2013-09-03T13:08:57.150 回答
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;    
}

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

当一个团队有很多球员时,在不需要他们的时候加载所有球员是没有效率的。因此,在这种情况下,您可以声明您希望在实际需要播放器时加载它们。这称为延迟加载。

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

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

于 2013-09-03T13:54:37.100 回答