2011-01-11 56 views
5

我遇到問題,Hibernate正在查詢懶惰onetoone關係的另一端的類。休眠JPA 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; 
    } 
} 

回答