mku*_*uff 0 java hibernate jpa
我知道hibernate是懒惰的默认提取策略,但有一些事情我不清楚,所以我希望你能解释一下.我想要做的是将标记为标记为起始图块的图块.
查询:
@NamedQuery(name = "Tile.findStartTileByGame",
query = "SELECT t FROM Tile t WHERE t.game = :game " +
"and t.startTile = true and t.blockWalkable = false")
Run Code Online (Sandbox Code Playgroud)
瓦:
public class Tile{
@OneToOne(mappedBy="tile")
private GameCharacter character;
@OneToOne(mappedBy="tile")
private GameObject gameObject;
Run Code Online (Sandbox Code Playgroud)
游戏:
@OneToMany(mappedBy="game")
private List<Tile> tiles;
Run Code Online (Sandbox Code Playgroud)
当我运行我的查询并且从不使用该对象时,hibernate仍然加入了我的角色和游戏对象.所以我有3个查询.我知道我可以通过fetch join来解决这个问题,但我的问题是为什么hibernate会同时获取两个引用?即使我使用fetch = FetchType.LAZY对它们进行注释,也会查询它.
我的DAO:
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();
...
Run Code Online (Sandbox Code Playgroud)
在我解决这个问题之前,我想了解它为什么会发生.在此先感谢m
它发生的原因是它们被标记为可空.当使用代理时,Hibernate仍然需要知道代理与实际上只是普通null的区别.
当关系是一个集合时,它可以为您提供一个空集合,然后再进行检查.但是当它出现时OneToOne,它必须查看数据库,以确定该字段是否应该为null,或者它是否可以被代理和延迟加载.因为它无论如何都要看,它只是加载它.
如果你标记两者fetch=FetchType.LAZY,optional=false你可以在onetoone上得到懒惰.当然,如果列实际可以为空,那么你就是SOL.
| 归档时间: |
|
| 查看次数: |
455 次 |
| 最近记录: |