Hibernate JPA OneToOne запросы несмотря на Lazy Fetch - PullRequest
5 голосов
/ 11 января 2011

У меня возникают проблемы, когда 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;
    }
}

1 Ответ

13 голосов
/ 11 января 2011

Я нашел ответ.

Это потому, что один на один обнуляется.Тогда он не может реализовать ленивый объект загрузки.Поэтому я решил эту проблему, перейдя к отношениям «многие к одному» и просто найдя набор из одного объекта.

Вот хорошая ссылка.Тем временем для тех, кто читает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...