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也存储在房间实体表(或视图等),但我认为它必须是,因为它需要能够在第一个地方进行连接。

编辑:正如@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,而不会引起任何问题。

最新更新