尽管使用了Lazy Fetch,Hibernate JPA OneToOne仍在查询

And*_*rew 5 hibernate

我遇到的问题是Hibernate在懒惰的onetoone关系的另一边查询一个类.

对top_players的查询(取决于缓存设置)通过映射表进行查询以获取QHPlayer表的ID.

在执行主查询之后,它查询QHPlayer表的每个实例.

但是,它在两种不同的场景中做错了.

如果我打开了缓存,它将查询QHPlayer的实例,然后它将查询到inventory_item表.如果我关闭了缓存,它将通过加入inventory_item向QHPlayer进行查询.

问题是无论我怎么做,它都坚持查询inventory_item表.这是我不想要的.我目前不需要inventory_item中的数据.

我假设QHPlayer和PlayerInventoryItem之间的onetoone声明有问题.

有什么想法吗?

相关代码如下:

    Query query = entityManager.createQuery( "SELECT c FROM top_players c WHERE c.teamId=:teamId ORDER BY c.level DESC, c.adjustedFantasyPointsTotal DESC, c.id ASC" );
    query.setParameter( "teamId", teamId );
    List<TopPlayers> results = query.getResultList();



    @XmlAccessorType( XmlAccessType.PROPERTY)
@Entity( name="player_template")
@Table( name="player_template" )
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class QhPlayer implements Serializable {

    @Id
    public Integer getPlayerTemplateId() {
        return playerTemplateId;
    }

    @OneToOne( mappedBy ="playerTemplate", fetch = FetchType.LAZY)
    @XmlTransient
    public PlayerInventoryItem getInventoryItem() {
        return inventoryItem;
    }

}


@Entity( name = "qhplayer_inventory_item" )
@DiscriminatorValue("PLAYER")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class PlayerInventoryItem extends InventoryItem {
    private QhPlayer playerTemplate;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="player_template_id")
    @XmlTransient
    public QhPlayer getPlayerTemplate() {
        return playerTemplate;
    }
}



@Entity( name="inventory_item" )
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
        name = "inventory_item_type",
        discriminatorType = DiscriminatorType.STRING
)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public abstract class InventoryItem {
    private int inventoryItemId;
}



@Entity( name = "top_players")
@XmlRootElement(name = "top_player")
@Table(name="player")
@SecondaryTables({
        @SecondaryTable(name="player_stats", pkJoinColumns={
                @PrimaryKeyJoinColumn(name="playerId", referencedColumnName="id")
        }),
        @SecondaryTable(name="player_mapping", pkJoinColumns={
                @PrimaryKeyJoinColumn(name="playerId", referencedColumnName="id")
        })       
})
@XmlAccessorType( XmlAccessType.PROPERTY )
public class TopPlayers {

    private QhPlayer playerTemplate;

    @XmlTransient
    @ManyToOne
    @JoinColumn( table="player_mapping", name = "player_template_id", nullable = true )
    public QhPlayer getPlayerTemplate() {
        return playerTemplate;
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*rew 13

我找到了答案.

这是因为一对一可以为空.然后它无法实现延迟加载对象.所以我通过多对一的关系来解决它,只是寻找一个对象的集合.

这是一个很好的参考.
http://community.jboss.org/wiki/Someexplanationsonlazyloadingone-to-one

同时感谢任何阅读此内容的人.