2011-01-11 13 views
5

sto avendo problemi in cui Hibernate sta interrogando una classe al di là di una relazione OnetoOne pigro.Hibernate JPA OnetoOne interrogazione nonostante pigro Fetch

la query al top_players, a seconda delle impostazioni della cache esegue una query tramite una tabella di mappatura per ottenere gli ID per la tabella QHPlayer.

Dopo aver fatto la domanda principale, interroga per ogni istanza del tavolo QHPlayer.

Tuttavia, fa la cosa sbagliata in due diversi scenari.

Se ho il caching acceso, interrogherà le istanze di QHPlayer e poi sarà l'interrogazione attraverso la tabella inventory_item. Se il caching è stato disattivato, effettuerà la query a QHPlayer con un join su inventory_item.

Il problema è che, indipendentemente da come lo faccio, insiste a interrogare la tabella inventory_item. Questo è quello che non voglio. Non ho bisogno dei dati in inventory_item in questo momento.

Suppongo che ci sia qualcosa di sbagliato nelle mie dichiarazioni di assenza tra QHPlayer e PlayerInventoryItem.

Qualche idea per favore?

Il codice in questione è qui sotto:

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; 
    } 
} 

risposta

Problemi correlati