java - object is not an instance of declaring class -Hibernate -
i new hibernate , practicing examples on one-to-many mapping not getting why throwing error.
1)employee.java
package com.common.pojo; import java.util.set; public class employee { private int id; private string name; private set certificate; public employee (){} public employee(string name) { this.name = name; } public int getid() { return id; } public void setid(int id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } public set getcertificate() { return certificate; } public void setcertificate(set certificate) { this.certificate = certificate; } }
2) certificate.java
package com.common.pojo; public class certificate { private int id; private string name; public certificate(){} public certificate(string name) { this.name = name; } public int getid() { return id; } public void setid(int id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } }
3)employee.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!doctype hibernate-mapping public "-//hibernate/hibernate mapping dtd 3.0//en" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class table="employee" name="com.common.pojo.employee"> <meta attribute="class-description"> employee class </meta> <id name="id" column="id" type="int"> <generator class="native"></generator> </id> <property name="name" column="name" type="string"></property> <set name="certificate" cascade="all"> <key column="id"></key> <one-to-many class="com.common.pojo.certificate" /> </set> </class> <class table="certificate" name="com.common.pojo.certificate"> <meta attribute="class-description"> certificate class </meta> <id name="id" column="cer_id" type="int"> <generator class="native"></generator> </id> <property name="name" column="cer_name" type="string"></property> </class> </hibernate-mapping>
4)hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?> <!doctype hibernate-configuration public "-//hibernate/hibernate configuration dtd 3.0//en" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dilect">org.hibernate.dialect.hsqldialect</property> <property name="hibernate.driver.connection_class">org.hsqldb.jdbcdriver</property> <property name="hibernate.connection.url">jdbc:hsqldb:hsql://localhost/</property> <property name="hibernate.connection.username">sa</property> <property name="hibernate.connection.password"></property> <property name="show_sql">true</property> <mapping resource="employee.hbm.xml" /> </session-factory> </hibernate-configuration>
5)testapp.java
package com.common.mainapp; import java.util.hashset; import java.util.set; import org.hibernate.hibernateexception; import org.hibernate.session; import org.hibernate.sessionfactory; import org.hibernate.transaction; import org.hibernate.cfg.configuration; import com.common.pojo.employee; public class testapp { private static sessionfactory factory; @suppresswarnings("deprecation") public static void main(string[] args) { try { factory =new configuration().configure().buildsessionfactory(); } catch(hibernateexception exception) { exception.printstacktrace(); } testapp app=new testapp(); set certificate =new hashset(); certificate.add("be"); certificate.add("mba"); certificate.add("bca"); app.addemployee("amit",certificate); set certificate1 =new hashset(); certificate1.add("scjp"); certificate1.add("ocjp"); app.addemployee("sunil",certificate1); } public void addemployee(string name,set certificate) { transaction tx=null; session session=factory.opensession(); integer employeeid =null; try { tx=session.begintransaction(); employee employee=new employee(name); employee.setcertificate(certificate); employeeid = (integer) session.save(employee); tx.commit(); } catch(hibernateexception exception) { if (tx!=null) tx.rollback(); exception.printstacktrace(); } { session.close(); } } }
and have created table employee , certificate using below ddl command
create table certificate ( cer_id int identity, cer_name varchar(25), emp_id int )
and
create table employee ( id int identity, name varchar(25) )
but after running getting below error.
hibernate: insert employee (id, name) values (default, ?) apr 14, 2014 6:34:35 em org.hibernate.property.basicpropertyaccessor$basicgetter error: hhh000122: illegalargumentexception in class: com.common.pojo.certificate, getter method of property: id org.hibernate.propertyaccessexception: illegalargumentexception occurred calling getter of com.common.pojo.certificate.id @ org.hibernate.property.basicpropertyaccessor$basicgetter.get(basicpropertyaccessor.java:192) @ org.hibernate.tuple.entity.abstractentitytuplizer.getidentifier(abstractentitytuplizer.java:346) @ org.hibernate.persister.entity.abstractentitypersister.getidentifier(abstractentitypersister.java:4740) @ org.hibernate.persister.entity.abstractentitypersister.istransient(abstractentitypersister.java:4459) @ org.hibernate.engine.internal.foreignkeys.istransient(foreignkeys.java:243) @ org.hibernate.event.internal.abstractsaveeventlistener.getentitystate(abstractsaveeventlistener.java:511) @ org.hibernate.event.internal.defaultsaveorupdateeventlistener.performsaveorupdate(defaultsaveorupdateeventlistener.java:100) @ org.hibernate.event.internal.defaultsaveorupdateeventlistener.onsaveorupdate(defaultsaveorupdateeventlistener.java:90) @ org.hibernate.internal.sessionimpl.firesaveorupdate(sessionimpl.java:680) @ org.hibernate.internal.sessionimpl.saveorupdate(sessionimpl.java:672) @ org.hibernate.engine.spi.cascadingactions$5.cascade(cascadingactions.java:235) @ org.hibernate.engine.internal.cascade.cascadetoone(cascade.java:352) @ org.hibernate.engine.internal.cascade.cascadeassociation(cascade.java:295) @ org.hibernate.engine.internal.cascade.cascadeproperty(cascade.java:161) @ org.hibernate.engine.internal.cascade.cascadecollectionelements(cascade.java:381) @ org.hibernate.engine.internal.cascade.cascadecollection(cascade.java:321) @ org.hibernate.engine.internal.cascade.cascadeassociation(cascade.java:298) @ org.hibernate.engine.internal.cascade.cascadeproperty(cascade.java:161) @ org.hibernate.engine.internal.cascade.cascade(cascade.java:118) @ org.hibernate.event.internal.abstractsaveeventlistener.cascadeaftersave(abstractsaveeventlistener.java:460) @ org.hibernate.event.internal.abstractsaveeventlistener.performsaveorreplicate(abstractsaveeventlistener.java:294) @ org.hibernate.event.internal.abstractsaveeventlistener.performsave(abstractsaveeventlistener.java:194) @ org.hibernate.event.internal.abstractsaveeventlistener.savewithgeneratedid(abstractsaveeventlistener.java:125) @ org.hibernate.event.internal.defaultsaveorupdateeventlistener.savewithgeneratedorrequestedid(defaultsaveorupdateeventlistener.java:209) @ org.hibernate.event.internal.defaultsaveeventlistener.savewithgeneratedorrequestedid(defaultsaveeventlistener.java:55) @ org.hibernate.event.internal.defaultsaveorupdateeventlistener.entityistransient(defaultsaveorupdateeventlistener.java:194) @ org.hibernate.event.internal.defaultsaveeventlistener.performsaveorupdate(defaultsaveeventlistener.java:49) @ org.hibernate.event.internal.defaultsaveorupdateeventlistener.onsaveorupdate(defaultsaveorupdateeventlistener.java:90) @ org.hibernate.internal.sessionimpl.firesave(sessionimpl.java:711) @ org.hibernate.internal.sessionimpl.save(sessionimpl.java:703) @ org.hibernate.internal.sessionimpl.save(sessionimpl.java:698) @ com.common.mainapp.testapp.addemployee(testapp.java:74) @ com.common.mainapp.testapp.main(testapp.java:52) caused by: java.lang.illegalargumentexception: object not instance of declaring class @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(unknown source) @ sun.reflect.delegatingmethodaccessorimpl.invoke(unknown source) @ java.lang.reflect.method.invoke(unknown source) @ org.hibernate.property.basicpropertyaccessor$basicgetter.get(basicpropertyaccessor.java:169) ... 32 more
you've mapped certificates set of certificate
objects:
<set name="certificate" cascade="all"> <key column="id"></key> <one-to-many class="com.common.pojo.certificate" /> </set>
but in test add string
s set:
set certificate =new hashset(); certificate.add("be"); certificate.add("mba"); certificate.add("bca");
java's generics recognizing such errors on compile time, better specify element type of collections use, compilation error when adding wrong element types:
private set<certificate> certificate;
Comments
Post a Comment