Hibernate加载一个懒惰的代理,但我只需要PK

我有这些实体:

@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保持链接到当前SessionSession上有一个getIdentifier()方法,它应该获取id。 文档没有说明任何内容,但通常不应该初始化对象。

您可以在Room实体上拥有@Column private long playerId的属性。 您可以调用此属性来获取id,而无需在事务中调用整个Player对象。

这只有在playerId也存储在Room实体表(或视图等)中时才有效,但我认为它必须是因为它需要能够首先进行连接。

编辑:如下面提到的@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,而不会导致任何问题。