我遇到問題,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;
}
}