5

我有这些实体:

@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

4

3 回答 3

4

Hibernate 应该保持对象的 id 也链接到当前的Session. 并且有一个getIdentifier()方法Session应该获取 id。文档没有说明它,但通常它不应该初始化对象。

于 2013-04-11T10:23:32.967 回答
1

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

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

编辑:正如下面提到的@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
    ...

}
于 2013-04-11T10:08:59.890 回答
0

我找到了一个更简单的解决方案,即制作getId() final. 这将防止 Hibernate 在代理中使用延迟获取操作覆盖它,因此它只会返回已知 ID,而不会导致任何问题。

于 2015-04-08T12:50:29.663 回答