尽管延迟获取,Hibernate JPA OneToOne 查询

标签 hibernate

我在 Hibernate 查询惰性一对一关系另一侧的类时遇到问题。

对 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;
    }
}

最佳答案

我找到了答案。

这是因为一对一是可以为空的。那么它就不能实现延迟加载对象。所以我通过进入多对一关系并只寻找一个对象的集合来解决它。

这是一个很好的引用。
http://community.jboss.org/wiki/Someexplanationsonlazyloadingone-to-one

同时感谢任何阅读本文的人。

关于尽管延迟获取,Hibernate JPA OneToOne 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4653909/

相关文章:

java - 无法在延迟加载数据表中使用数字筛选器 : ClassCastException String to Integer

java - @Transient 在 hibernate 状态下不工作

hibernate - 使用动态查找器时,是否可以忽略hasMany关系?

hibernate - Spring boot + hibernate - 实体未映射 + 最佳配置方式

java - 克隆复杂的 Hibernate 实体

java - JPA Query with HQL and pageable create subselect with * return 并生成别名错误

java - 没有 Hibernate Session 绑定(bind)到线程异常

hibernate - 如何避免嵌套事务不支持错误?

spring - 带有@Audited 的基本模型

java - 拥有方与非拥有方在 hibernate 中及其在元素映射引用中的用法?