我在 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/