我正在使用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
。
我的问题是:为什么我的所有玩家都没有完全装满?为什么他们中的一些人很懒?我想让我所有的玩家都没有懒惰的加载,我该怎么办?
谢谢
答案 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
。
希望这能解决你的问题......