2011-04-17 13 views
7

एक अजीब समस्या का सामना कर रहा हूं, मैंने इसे घंटों तक गुगल किया है, लेकिन इसे हल करने का तरीका नहीं पता था।कक्षा में अवैध श्रेणी: अपवाद: ..., संपत्ति का गेटर विधि: आईडी

यहां स्थिति है: मेरे पास दो वर्ग Roles और Privileges संबंध कईToMany के साथ है। एक भूमिका में विशेषाधिकार जोड़ने पर, saveOrUpdate(role) पर कॉलिंग, मैं इस अपवाद में आया था।

यहाँ भूमिका कक्षा

@Entity 
@Table(name = "ROLES") 
public class Role implements GenericDomain { 

private static final long serialVersionUID = -7620550658984151796L; 

private Long id; 
private String code; 
private String name; 

private Set<User> users = new HashSet<User>(0); 
private Set<Privilege> privileges = new HashSet<Privilege>(0); 

public Role() { 
} 

public Role(String code, String name) { 
    this.code = code; 
    this.name = name; 
} 


@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name = "ID") 
public Long getId() { return id; } 
public void setId(Long id) { this.id = id; } 

@Column(name = "CODE", unique = true, nullable = false, length = 16) 
@NotEmpty(message= "password.required") 
@Length(min = 3, max = 16) 
public String getCode() { return code; } 
public void setCode(String code) { this.code = code; } 

@Column(name="NAME", nullable = false, length = 64) 
@NotEmpty 
@Length(min = 1, max = 32) 
public String getName() { return name; } 
public void setName(String name) { this.name = name; } 

@ManyToMany(cascade=CascadeType.ALL) 
@JoinTable(name = "ROLES_PRIVILEGES" 
    , joinColumns = { @JoinColumn(name = "ROLE_ID") } 
    , inverseJoinColumns = { @JoinColumn(name = "PRIVILEGE_ID") } 
) 

public Set<Privilege> getPrivileges() { 
    return this.privileges; 
} 
public void setPrivileges(Set<Privilege> privileges) { 
    this.privileges = privileges; 
} 
    /* overide of hascode, equals*/ 
} 

यहाँ है विशेषाधिकार कक्षा

@Entity 
@Table(name = "PRIVILEGES") 
public class Privilege implements GenericDomain { 

private static final long serialVersionUID = 4649689934972816194L; 

private Long id; 
private String code; 

private Set<Role> roles = new HashSet<Role>(0); 

public Privilege() { 
} 

public Privilege(String code) { 
    this.code = code; 
} 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name = "ID") 
public Long getId() { return id; } 
public void setId(Long id) { this.id = id; } 

@Column(name = "CODE", unique = true, nullable = false, length = 16) 
@NotEmpty(message= "password.required") 
@Length(min = 3, max = 16) 
public String getCode() { return code; } 
public void setCode(String code) { this.code = code; } 

@ManyToMany(cascade=CascadeType.REFRESH, mappedBy="privileges") 
public Set<Role> getRoles() { 
    return this.roles; 
} 
public void setRoles(Set<Role> roles) { 
    this.roles = roles; 
} 

/*overide equals and hascode*/ 

}

यहाँ है और अपवाद है:

IllegalArgumentException in class: com.stunaz.domain.Privilege, getter method of property: id 
.... 
javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.stunaz.domain.Privilege.id 
.... 
java.lang.IllegalArgumentException: object is not an instance of declaring class 

इसके somethi लगता है एनजी मेरे मैपिंग के साथ गलत है, कहीं कहीं मुझे ऑब्जेक्ट पास करना चाहिए लेकिन मैं एक आईडी पास कर रहा हूं। लेकिन मुझे वह गलती नहीं दिखाई दे रही है।

किसी भी सलाह के लिए धन्यवाद।

+0

मैंने कोड को परिभाषित किया है जैसा कि आप अपने उदाहरण में कर रहे हैं और यह मेरे लिए ठीक काम करता है। शायद आप अपनी पोस्ट में उल्लेख की गई विधिOrUpdate विधि को दिखा सकते हैं। शायद समस्या वहाँ है। –

+0

हाँ आप हाइबरनेट –

+0

के साथ बिल्कुल सही नहीं हैं क्या आपने इस समस्या को हल किया? मुझे मेरी परियोजना में एक ही त्रुटि है। –

उत्तर

0

getId() विधि को कॉल करने के लिए एक अवैध तर्क अपवाद प्राप्त करने के लिए, ऐसा लगता है कि हाइबरनेट सोचता है कि आपकी आईडी का प्रकार लंबा (शायद पूर्णांक) के अलावा कुछ और है। शायद अपने आईडी में @Type(type="long") जोड़ने का प्रयास करें।

जब भी मुझे हाइबरनेट के साथ अजीब समस्याएं होती हैं, तो मैं हमेशा स्रोत कोड संलग्न करता हूं और त्रुटि के दौरान डीबग करता हूं। इससे आपको कुछ अंतर्दृष्टि मिल सकती है कि हाइबरनेट क्या करने का प्रयास कर रहा है, और यह पता लगाने में सहायता करें कि आपने कहां से कुछ याद किया है, या कहीं भी खराब बहस पारित की है।

+0

आपके उत्तर के लिए धन्यवाद, लेकिन यह मदद नहीं मिली। कृपया मुझे बताएं कि आप कैसे डिबग करते हैं, आप किस स्रोत को जोड़ रहे हैं? और आप कहां और कैसे संलग्न कर रहे हैं? –

0

अपने कोड के लिए हो सकता है सिवाय ठीक लग रहा है पहली नज़र में:

@ManyToMany(cascade=CascadeType.REFRESH, mappedBy="privileges") 

मुझे यकीन है कि अगर यह सही नहीं है नहीं कर रहा हूँ, लेकिन इस तरह से मैं यह कर रहा है:

@ManyToMany(cascade=CascadeType.REFRESH, mappedBy="privileges", targetEntity = Roles.class) 

यह mappedBy संपत्ति छोड़ा जा सकता है ...

+0

धन्यवाद, इसने मदद नहीं की है ((( –

0

आप इसे कैसे सहेज रहे/अपडेट कर रहे हैं?

क्या आपको 'रोल' ऑब्जेक्ट मिल रहा है जिसके लिए आप findById (लंबी भूमिका आईडी) को कॉल करके 'अनुमति' को सहेजना चाहते हैं? एक बार जब आप उस भूमिका वस्तु को एक नया अनुमति ऑब्जेक्ट और सेटरोल (भूमिका) बनाते हैं और अन्य गुण सेट करते हैं और saveOrUpdate (अनुमति) को कॉल करते हैं? यह काम करना चाहिए।

1

हाइबरनेट उपयोगकर्ता को यह बताने में आता है कि मैपिंग के साथ क्या गलत है।

समाधान:

  1. डीबग एप्लिकेशन
  2. IllegalArgumentException की घटना के लिए एक ब्रेकपाइंट सेट फेंक दिया जा रहा है (कहीं)
  3. आपरेशन जो इस
  4. जाओ कॉल स्टैक के माध्यम से ऊपर का कारण बनता है प्रदर्शन करना और सक्रिय स्टैक चर का निरीक्षण करें।

इस प्रक्रिया का उपयोग करके, मुझे पता चला कि मेरे मैपिंग में क्या गलत था।

सामान्य में, क्या से मैंने देखा है, यह आमतौर पर गलत वर्ग स्पष्ट रूप कहीं कहा गया है, @MapKeyClass(Wrong.class) की तरह जब कुंजी वास्तव में है String आदि

या, बुला गलत (हाइबरनेट) एपीआई, setParameter() बजाय setParameterList() की तरह:

DetachedCrite:

Query query = session.getNamedQuery(queryName); 
// org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter 
query.setParameter("children", aCollectionOfChildren); 
query.list(); 

या, मानदंड एपीआई के मामले में, मैं इस देखा है रिया आलोचक = DetachedCriteria.forClass (Group.class); crit.add (Restrictions.eq ("पैरेंट", आईडी));

ग्रुप की getParent() विधि समूह लौटाती है लेकिन मैं इसे लंबे समय से तुलना करने के लिए का प्रयास कर रहा था।

0

दूसरों के लिए बस एक नोट हालांकि यह इस समस्या से संबंधित नहीं हो सकता है। यह मेरे साथ हुआ कि मैं एक डीईटीओ को एक आरईएसटी एपीआई से एक इकाई में आ रहा था। बच्चे डीटीओ में से एक को बच्चे की संस्था (मैं डोज़र का उपयोग कर रहा था) में सही ढंग से मैप नहीं किया गया था। हाइबरनेट विफल रहा क्योंकि डीटीओ की आईडी इकाई की आईडी के साथ संगत नहीं थी।

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