我有这些实体:
@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
而不触发数据库访问?
Hibernate应该保持对象的id也链接到当前的Session
。Session
上有一个getIdentifier()方法,应该获得id。文档中对此没有任何说明,但通常它不应该初始化对象。
您可以在Room实体上设置一个@Column private long playerId
属性。你可以调用这个属性来获得id,而不必在事务中调用整个Player对象。
这将只工作,如果playerId也存储在房间实体表(或视图等),但我认为它必须是,因为它需要能够在第一个地方进行连接。
编辑:正如@Adam Dyga下面提到的,这些应该是可插入和可更新的,都为false
@Entity
public class Room {
@ManyToOne(optional=true,fetch=FetchType.LAZY)
private Player player1;
@Column(name="id", insertable = false, updatable = false)
private long playerId
...
}
我发现了一个更简单的解决方案,这是使getId()
final
。这将防止Hibernate在代理中使用延迟抓取操作重写它,因此它将只返回已知的ID,而不会引起任何问题。