2011-01-11 15 views
5

Tengo problemas donde Hibernate está consultando una clase del otro lado de una relación perezosa onetoone.Hibernate Consulta de JPA OneToOne a pesar de Lazy Fetch

La consulta a top_players, dependiendo de la configuración de caché, realiza una consulta a través de una tabla de asignación para obtener los ID de la tabla QHPlayer.

Después de realizar la consulta principal, consulta cada instancia de la tabla QHPlayer.

Sin embargo, hace lo incorrecto en dos escenarios diferentes.

Si tengo el almacenamiento en caché activado, consultará las instancias de QHPlayer y luego consultará la tabla inventory_item. Si tengo el almacenamiento en caché desactivado, se realizará la consulta a QHPlayer con una unión a inventory_item.

El problema es que no importa cómo lo hago, insiste en consultar la tabla inventory_item. Esto es lo que no quiero No necesito los datos en inventory_item en este momento.

Supongo que algo anda mal con mis declaraciones onetoone entre QHPlayer y PlayerInventoryItem.

¿Alguna idea por favor?

El código en cuestión es el siguiente:

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

Respuesta

13

he encontrado la respuesta.

Es porque el one-to-one es anulable. Entonces no puede implementar un objeto de carga diferido. Así que lo resolví yendo a una relación de muchos a uno y solo buscando el conjunto de un objeto.

Aquí hay una buena referencia.
http://community.jboss.org/wiki/Someexplanationsonlazyloadingone-to-one

Gracias mientras tanto para cualquier persona que lea esto.

Cuestiones relacionadas