gpt4 book ai didi

java - Hibernate @ManyToOne getId() 导致获取

转载 作者:太空宇宙 更新时间:2023-11-04 07:56:38 25 4
gpt4 key购买 nike

我有一个非常简单的选择(SELECT h FROM Hero h where h.owner = :player)导致 n+1 问题的问题。该查询触发游戏中每个英雄实体的选择。

首先,我添加了惰性获取类型,这在选择期间删除了替代查询。在我的代码中,我只需要游戏一次即可获取 id。这触发了对每个实体的再次选择。

所以我添加了一个连接获取,这有帮助,但它导致了我不需要的连接!我怎样才能告诉hibernate代理对象给我id而不获取整个实体?

我尝试了那里的提示但没有成功:http://256stuff.com/gray/docs/misc/hibernate_lazy_field_access_annotations.shtml

hibernate 中的 @AccessType 和 javax 中的 @Access 没有区别。当我调用 getId() 时,游戏将始终被获取。

有什么想法我错过了吗?我经常需要这个,如果可以的话我想避免加入。

问候,马库斯

PS:我使用 jpa2 + hibernate 4 和 jboss 7。

@Entity
@NamedQueries({
@NamedQuery(name = "Hero.findByPlayer", query = "SELECT h FROM Hero h JOIN FETCH h.game where h.owner = :player")
})
public class Hero extends GameCharacter implements Serializable {
@ManyToOne
private Player owner;

@Entity
public abstract class GameCharacter extends GameObject implements Serializable {
... nothing special in here
}

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public abstract class GameObject implements Serializable {
@Id
private String id = java.util.UUID.randomUUID().toString();

@ManyToOne(fetch=FetchType.LAZY)
protected Game game;

@Entity
public class Game implements Serializable {
private static final long serialVersionUID = 4379242677193301727L;

@Id
private String id = java.util.UUID.randomUUID().toString();

最佳答案

这只是 hibernate 中延迟加载工作方式的副作用。本质上,对惰性对象的任何访问都会导致它填充。它不会对 id 进行特殊处理。

我认为您实际上无法在不触发加载的情况下从游戏对象访问 ID。你可以做的是使用 getIdentifier 方法向 hibernate 询问对象的 id。我相信这不会触发获取,因为 hibernate 只是查找该对象的元数据。

或者,您可以在执行查询时加载英雄的游戏 ID。

例如

SELECT h, h.game.id FROM Hero h where h.owner = :player

这不会像当前查询那样找到英雄列表,而是返回一个对列表,每对都有英雄和游戏 ID。

ID 在 HQL 中经过特殊处理,因此在尝试访问对象时不会触发获取或连接。

关于java - Hibernate @ManyToOne getId() 导致获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13526148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com