2011-01-11 16 views
5

के बावजूद पूछताछ में मुझे समस्याएं आ रही हैं जहां हाइबरनेट आलसी ऑनटोन संबंध के दूसरी तरफ एक कक्षा से पूछताछ कर रहा है।आलसी जेपीए वनटोनी पूछताछ आलसी Fetch

कैश सेटिंग्स के आधार पर शीर्ष_प्लेयर की क्वेरी QHPlayer तालिका के लिए आईडी प्राप्त करने के लिए मैपिंग तालिका के माध्यम से एक क्वेरी करता है।

मुख्य क्वेरी करने के बाद, यह QHPlayer तालिका के प्रत्येक उदाहरण के लिए पूछताछ करता है।

हालांकि, यह दो अलग-अलग परिदृश्यों में गलत बात करता है।

यदि मेरे पास कैशिंग चालू है, तो यह QHPlayer के उदाहरणों से पूछताछ करेगा और फिर यह inventory_item तालिका से पूछताछ करेगा। यदि मेरे पास कैशिंग बंद है, तो यह क्वेरी को QHPlayer में inventory_item में शामिल होने के साथ क्वेरी करेगा।

समस्या यह है कि कोई फर्क नहीं पड़ता कि मैं इसे कैसे करता हूं, यह 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; 
    } 
} 

उत्तर

13

मैं इस सवाल का जवाब मिल गया।

ऐसा इसलिए है क्योंकि एक-से-एक शून्य है। फिर यह एक आलसी लोडिंग ऑब्जेक्ट को लागू नहीं कर सकता है। इसलिए मैंने इसे एक-से-एक रिश्ते पर जाकर और एक वस्तु के सेट की तलाश करके हल किया।

यहां एक अच्छा संदर्भ है।
http://community.jboss.org/wiki/Someexplanationsonlazyloadingone-to-one

इस दौरान इसे पढ़ने वाले किसी भी व्यक्ति के लिए धन्यवाद।

संबंधित मुद्दे