У меня возникают проблемы, когда Hibernate запрашивает класс на другой стороне ленивого однотонного отношения.
Запрос к top_players, в зависимости от настроек кэша, выполняет запрос через таблицу сопоставления для получения идентификаторов.для таблицы QHPlayer.
После выполнения основного запроса он запрашивает каждый экземпляр таблицы QHPlayer.
Однако в двух разных сценариях он работает неправильно.
Если у меня включено кэширование, оно будет запрашивать экземпляры QHPlayer, а затем отправлять запросы в таблицу inventory_item.Если у меня отключено кэширование, он выполнит запрос к QHPlayer с объединением к inventory_item.
Проблема в том, что независимо от того, как я это делаю, он настаивает на запросе к таблице inventory_item.Это то, чего я не хочу.В настоящее время мне не нужны данные инвентаризации.
Я предполагаю, что что-то не так с моими объявлениями в одном окне между QHPlayer и PlayerInventoryItem.
Есть идеи, пожалуйста?
Соответствующий код ниже:
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;
}
}