Java 理解Hibernate获取

Java 理解Hibernate获取,java,hibernate,jpa,Java,Hibernate,Jpa,我知道hibernate的默认抓取策略是lazy,但有些事情我还不清楚,所以我希望你能给我解释一下。我要做的是将一个磁贴标记为“开始磁贴” 查询: @NamedQuery(name = "Tile.findStartTileByGame", query = "SELECT t FROM Tile t WHERE t.game = :game " + "and t.startTile = true and t.blockWalkable = false") 瓷砖: 游戏: @One

我知道hibernate的默认抓取策略是lazy,但有些事情我还不清楚,所以我希望你能给我解释一下。我要做的是将一个磁贴标记为“开始磁贴”

查询:

@NamedQuery(name = "Tile.findStartTileByGame", 
  query = "SELECT t FROM Tile t WHERE t.game = :game " +
    "and t.startTile = true and t.blockWalkable = false")
瓷砖:

游戏:

@OneToMany(mappedBy=“game”)
私人名单瓷砖;
当我运行查询并且从不使用对象时,hibernate仍然将角色和游戏对象连接在一起。所以我有3个问题。我知道我可以通过fetch连接来解决这个问题,但我的问题是为什么hibernate会同时获取这两个实体?即使我用fetch=FetchType.LAZY注释它们,它也会被查询

我的刀:

  public static Tile getFreeStartTile(EntityManager em, Game game) {
   TypedQuery<Tile> query = em.createNamedQuery("Tile.findStartTileByGame", Tile.class);
   query.setParameter("game", game);
  List<Tile> result = query.getResultList();
  ...
公共静态互动程序GetFreeStart互动程序(EntityManager em,游戏){
TypedQuery query=em.createNamedQuery(“Tile.findStartTileByGame”,Tile.class);
query.setParameter(“游戏”,游戏);
List result=query.getResultList();
...
在我解决这个问题之前,我想了解它为什么会发生。 提前谢谢
发生这种情况的原因是它们被标记为可空。当使用代理时,Hibernate仍然需要知道代理和纯空之间的区别

当关系是一个集合时,它可以为您提供一个空集合,然后稍后检查。但是当关系是
OneToOne
时,它必须查看数据库中的字段是否应该为null,或者是否可以代理和延迟加载。因为它必须查看,所以它只能加载它


如果您同时标记了
fetch=FetchType.LAZY
optional=false
,则可以在onetoone上获得延迟抓取。当然,如果列actual可为null,则为SOL。

发生这种情况的原因是它们被标记为null。当使用代理时,Hibernate仍然需要知道要代理的列和要代理的列之间的区别你实际上只是个普通的空

当关系是一个集合时,它可以为您提供一个空集合,然后稍后检查。但是当关系是
OneToOne
时,它必须查看数据库中的字段是否应该为null,或者是否可以代理和延迟加载。因为它必须查看,所以它只能加载它

如果您同时标记了
fetch=FetchType.LAZY
optional=false
,则可以在onetoone上获得延迟抓取。当然,如果列actual可为空,则为SOL。

我找到了答案:

这也是我之前错过的一个好问题,它很好地解释了这一点:

问候

我找到了她的答案:

这也是我之前错过的一个好问题,它很好地解释了这一点:


您好

啊,我现在更明白为什么我的案例没有延迟加载。谢谢您的努力!啊,我现在更明白为什么我的案例没有延迟加载。谢谢您的努力!
 @OneToMany(mappedBy="game")
 private List<Tile> tiles;
  public static Tile getFreeStartTile(EntityManager em, Game game) {
   TypedQuery<Tile> query = em.createNamedQuery("Tile.findStartTileByGame", Tile.class);
   query.setParameter("game", game);
  List<Tile> result = query.getResultList();
  ...