2010-12-14 14 views
8

तो मैं एक मेज है कि मैं इस तरह हाइबरनेट में एक इकाई के रूप में परिभाषित किया है:हाइबरनेट फेंकता HibernateQueryException: संपत्ति हल नहीं कर सका

@Entity 
@Table(name = "sec_Preference") 
public class Preference { 
private long id; 

@Column(name = "PreferenceId", nullable = false, insertable = true, updatable = true, length = 19, precision = 0) 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Id 
public long getId() { 
    return id; 
} 

public void setId(long id) { 
    this.id = id; 
} 

private long systemuserid; 

@Column(name = "SystemUserId", nullable = true, insertable = true, updatable = true, length = 19, precision = 0) 
@Basic 
public long getSystemUserId() { 
    return systemuserid; 
} 

public void setSystemUserId(long systemuserid) { 
    this.systemuserid = systemuserid; 
} 

private long dbgroupid; 

@Column(name = "DBGroupId", nullable = true, insertable = true, updatable = true, length = 19, precision = 0) 
@Basic 
public long getDBGroupId() { 
    return dbgroupid; 
} 

public void setDBGroupId(long dbgroupid) { 
    this.dbgroupid = dbgroupid; 
} 

private long externalgroupid; 

@Column(name = "ExternalGroupId", nullable = true, insertable = true, updatable = true, length = 19, precision = 0) 
@Basic 
public long getExternalGroupId() { 
    return externalgroupid; 
} 

public void setExternalGroupId(long externalgroupid) { 
    this.externalgroupid = externalgroupid; 
} 

private long securityroleid; 

@Column(name = "SecurityRoleId", nullable = true, insertable = true, updatable = true, length = 19, precision = 0) 
@Basic 
public long getSecurityRoleId() { 
    return securityroleid; 
} 

public void setSecurityRoleId(long securityroleid) { 
    this.securityroleid = securityroleid; 
} 

public void setEnum(com.vitalimages.common.server.security.Preference pref) { 
    this.preferencekey = pref.name(); 
} 

private String preferencekey; 

@Column(name = "PreferenceKey", nullable = false, insertable = true, updatable = true, length = 255, precision = 0) 
@Basic 
public String getKey() { 
    return preferencekey; 
} 

public void setKey(String key) { 
    this.preferencekey = key; 
} 

private String preferencevalue; 

@Column(name = "PreferenceValue", nullable = true, insertable = true, updatable = true, length = 255, precision = 0) 
@Basic 
public String getValue() { 
    return preferencevalue; 
} 

public void setValue(String value) { 
    this.preferencevalue = value; 
} 

} 

जब मैं इस तालिका के खिलाफ एक सरल प्रश्न लिखने का प्रयास किया:

org.springframework.orm.hibernate3.HibernateQueryException: could not resolve property: dbgroupid of: com.common.server.domain.sec.Preference; nested exception is org.hibernate.QueryException: could not resolve property: dbgroupid of: com.common.server.domain.sec.Preference 

क्यों आंकड़ा बाहर हाइबरनेट नहीं कर सकते मैं क्या dbgroupid:

public Collection<Preference> getPreferencesForDBGroup(long dbgroupId) { 
    final DetachedCriteria criteria = DetachedCriteria.forClass(Preference.class) 
      .add(Restrictions.eq("dbgroupid", dbgroupId)) 
      .setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); 

    return getHibernateTemplate().findByCriteria(criteria); 
} 

मैं निम्नलिखित त्रुटि मिली मेरी कक्षा में है?

उत्तर

14

ऐसा शायद इसलिए है क्योंकि आपका गेटर (और सेटर) जावबीन्स सम्मेलन का पालन नहीं कर रहा है। यह होना चाहिए:

public long getDbgroupId() { 
    return dbgroupid; 
} 

क्या मेरा सुझाव होता है - अपने क्षेत्रों का नाम, और फिर अपने आईडीई का उपयोग setters और getters उत्पन्न करने के लिए। यह सम्मेलन का पालन करेगा। (एक और बात, यह वरीयता का विषय है, लेकिन मेरी राय में कक्षा को पढ़ने में आसान बनाता है - अपने फ़ील्ड को एनोटेट करें, गेटर्स नहीं)

+0

@ राल्फ - हाँ, यह निषिद्ध नहीं है। लेकिन मैंने अपना क्षेत्र का नाम शुरुआती बिंदु के रूप में लिया, इसलिए मैंने एक गेटर परिवर्तन का सुझाव दिया। यह चारों ओर एक और रास्ता हो सकता था। लेकिन आप सही हैं कि शुरुआत में कई पूंजी पत्र मुश्किल हैं। – Bozho

+0

आप सही हैं - मिस आपके उत्तरकर्ता को समझती है - इसलिए मैं अपनी टिप्पणी को पहले से ही हटा देता हूं – Ralph

+0

मुझे ऐसी ही समस्या थी जहां मैं सभी अपरकेस का उपयोग कर रहा था और सही गेटर नहीं ढूंढ रहा था: '.add (Restrictions.eq (" DBGROUPID ", dbgroupId)) ' –

2

शायद क्योंकि आपने इसे "डीबी ग्रुपआईडी" लेबल किया है, और "dbgroupid" नहीं?

+0

क्या ऐसा इसलिए है क्योंकि मैंने इसे getXXX विधि पर घोषित किया है? और यही वह जगह है जहां इसे पूंजीकरण मिल जाता है? –

5

ठीक है मैंने इस पर कुछ प्रगति की है लेकिन मुझे अभी भी समझ में नहीं आता है कि हाइबरनेट को इसके नाम कहां मिलते हैं। मैं हाइबरनेट की हिम्मत में डिबग और निम्न वर्ग पाया:

org.hibernate.persister.entity.AbstractPropertyMapping 

इस वर्ग में एक विधि है:

public Type toType(String propertyName) throws QueryException { 
    Type type = (Type) typesByPropertyPath.get(propertyName); 
    if (type == null) { 
     throw propertyException(propertyName); 
    } 
    return type; 
} 

कौन सा नाम वस्तु के खिलाफ मापदंड में दी गई हल करने की कोशिश करता है।

id -> [email protected] 
key -> [email protected] 
value -> [email protected] 
systemUserId -> [email protected] 
securityRoleId -> [email protected] 
externalGroupId -> [email protected] 
DBGroupId -> [email protected] 

यहाँ आप देख सकते हैं कि DBGroupId का पूंजीकरण क्या मैं अपने मापदंड में था से मेल नहीं खाती: typesByPropertyPath नक्शे में तो मैं निम्न मान पाया। तो मैं बदल कि dbgroupid से इस तरह DBGroupId रहे हैं:

public Collection<Preference> getPreferencesForDBGroup(long dbgroupId) { 
    final DetachedCriteria criteria = DetachedCriteria.forClass(Preference.class) 
      .add(Restrictions.eq("DBGroupId", dbgroupId)) 
      .setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); 

    return getHibernateTemplate().findByCriteria(criteria); 
} 

अब यह काम करता है।

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