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保持链接到当前Session
。 Session
上有一个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,而不会导致任何问题。