我有这些实体:
@Entity
public class Room {
@ManyToOne(optional=true,fetch=FetchType.LAZY)
private Player player1;
...
}
@Entity
public class Player {
@Id
@Column(updatable=false)
private long id;
public long getId() {
return id;
}
...
}
现在,这句话在Room
...
player1.getId();
...将导致从数据库中提取整个Player
实体。但是,我只需要它应该已有的主键id
(否则它如何获取数据?)。
如何在不触发数据库访问的情况下访问惰性Player
代理id
?
答案 0 :(得分:4)
Hibernate应该保持对象的id也链接到当前的Session
。 Session
上有一个getIdentifier()方法可以获取ID。文档没有说明任何内容,但通常不应该初始化对象。
答案 1 :(得分:1)
您可以在Room实体上拥有@Column private long playerId
的属性。您可以调用此属性来获取id,而无需在事务中调用整个Player对象。
这只有在playerId也存储在Room实体表(或视图等)中时才有效,但我认为它必须是因为它需要能够首先进行连接。< / p>
编辑:如下面提到的@Adam Dyga,这些应该是可插入的并且可以更新为假
@Entity
public class Room {
@ManyToOne(optional=true,fetch=FetchType.LAZY)
private Player player1;
@Column(name="id", insertable = false, updatable = false)
private long playerId
...
}
答案 2 :(得分:0)
我找到了一个更简单的解决方案,即getId()
final
。这将阻止Hibernate在代理中使用延迟抓取操作覆盖它,因此它只会返回已知的ID,而不会导致任何问题。