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

时间:2013-04-11 10:03:27

标签: java hibernate jpa

我有这些实体:

@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

3 个答案:

答案 0 :(得分:4)

Hibernate应该保持对象的id也链接到当前的SessionSession上有一个getIdentifier()方法可以获取ID。文档没有说明任何内容,但通常不应该初始化对象。

答案 1 :(得分:1)

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

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

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

}

答案 2 :(得分:0)

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