2011-01-11 5 views
5

У меня возникают проблемы, когда Hibernate запрашивает класс на другой стороне ленивых отношений onetoone.Hibernate JPA OneToOne запрос, несмотря на Lazy Fetch

Запрос к top_players, в зависимости от настроек кэша, выполняет запрос через таблицу сопоставления, чтобы получить идентификаторы для таблицы QHPlayer.

После выполнения основного запроса он запрашивает для каждого экземпляра таблицы QHPlayer.

Однако, это происходит не так, как в двух разных сценариях.

Если у меня включен кеширование, он будет запрашивать экземпляры QHPlayer, а затем он будет запрашивать информацию в таблице inventory_item. Если у меня отключено кэширование, он сделает запрос к QHPlayer с присоединением к inventory_item.

Проблема в том, что независимо от того, как я это делаю, она настаивает на том, чтобы запросить таблицу inventory_item. Этого я не хочу. В настоящее время мне не нужны данные в inventory_item.

Я предполагаю, что что-то не так в моих объявлениях onetoone между 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; 
    } 
} 

ответ

13

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

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

Вот хорошая ссылка.
http://community.jboss.org/wiki/Someexplanationsonlazyloadingone-to-one

Спасибо тем, кто прочитал это.

Смежные вопросы