对象不是声明类-Hibernate的实例 [英] object is not an instance of declaring class -Hibernate

查看:114
本文介绍了对象不是声明类-Hibernate的实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是HIbernate的新手,正在练习一对多映射的例子,但我不明白为什么它会抛出错误。

1)员工。 java

  package com.common.pojo; 

import java.util.Set;

公共类员工
{
private int id;
私人字符串名称;
私人设置证书;

public Employee(){}
$ b $ 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 p>

  package com.common.pojo; 

公共类证书
{
private int id;
私人字符串名称;

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;


code
$ b 3)Employee.hbm.xml

 <?xml version =1.0encoding =UTF-8?> 
<!DOCTYPE hibernate-mapping PUBLIC
- // Hibernate / Hibernate映射DTD 3.0 // EN
http://www.hibernate.org/dtd/hibernate-mapping -3.0.dtd>

< hibernate-mapping>
< class table =Employeename =com.common.pojo.Employee>
< meta attribute =class-description>
雇员类
< / meta>
< id name =idcolumn =idtype =int>
< generator class =native>< / generator>
< / id>
< property name =namecolumn =nametype =string>< / property>
< set name =certificatecascade =all>
< key column =id>< / key>
< / set>
< / class>


< class table =Certificatename =com.common.pojo.Certificate>
< meta attribute =class-description>
证书课程
< / meta>
< id name =idcolumn =cer_idtype =int>
< generator class =native>< / generator>
< / id>
< property name =namecolumn =cer_nametype =string>< / property>

< / class>


< / hibernate-mapping>



<4> hibernate.cfg.xml

 <?xml version =1.0encoding =UTF-8?> 
<!DOCTYPE hibernate-configuration PUBLIC
- // Hibernate / Hibernate配置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;
导入org.hibernate.cfg.Configuration;

导入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.printStackTrace();
}
TestApp app = new TestApp();
Set certificate = new HashSet();
certificate.add(BE);
certificate.add(MBA);
certificate.add(BCA);
app.addEmployee(Amit,证书);
Set certificate1 = new HashSet();
certificate1.add(SCJP);
certificate1.add(OCJP);
app.addEmployee(Sunil,certificate1);
}
public void addEmployee(String name,Set certificate)
{
Transaction tx = null;
会话会话= factory.openSession();
Integer employeeId = null;
尝试
{
tx = session.beginTransaction();
Employee employee = new Employee(name);
employee.setCertificate(certificate);
employeeId =(Integer)session.save(employee);
tx.commit();

catch(HibernateException异常)
{
if(tx!= null)tx.rollback();
exception.printStackTrace();
}
finally
{
session.close();
}
}

}

而我已使用以下DDL命令创建了表Employee和Certificate



pre codeREATE TABLE CERTIFICATE
$ b $ cer_id int IDENTITY,
cer_name varchar(25),
emp_id int

并且

  CREATE TABLE EMPLOYEE 

id int IDENTITY,
name varchar(25)

但是运行后我收到错误。

  Hibernate:insert into Employee(id,name)values(default,?)
apr 14,2014 6:34:35 EM org.hibernate .property.BasicPropertyAccessor $ BasicGetter得到
错误:HHH000122:抛出:IllegalArgumentException类:com.common.pojo.Certificate,财产的getter方法:ID
org.hibernate.PropertyAccessException:抛出:IllegalArgumentException发生调用COM的吸气剂。 common.pojo.Certificate.id
在org.hibernate.property.BasicPropertyAccessor $ BasicGetter.g等(BasicPropertyAccessor.java:192)
。在org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:346)
。在org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister。
at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4459)
at 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(Sessio nImpl.java:672)
在org.hibernate.engine.spi.CascadingActions $ 5.cascade(CascadingActions.java:235)
在org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java :352)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:295)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161)
at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:381)
at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:321)
at 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)
at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:460)
在org.hibernate.event.internal。 AbstractSaveEventListener.performSaveOrReplicate(分区:Abst ractSaveEventListener.java:294)在org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194

在org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)$ b在org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
$ b在org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
。在组织.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireSave(SessionIm pl.java:711)
在org.hibernate.internal.SessionImpl.save(SessionImpl.java:703)
在org.hibernate.internal.SessionImpl.save(SessionImpl.java:698)$ b在com.common.mainapp.TestApp.addEmployee处的$ b(TestApp.java:74)$ com.common.mainapp.TestApp.main处的
(TestApp.java:52)
导致:java.lang .IllegalArgumentException:对象不是在sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)中声明类
的实例$ b $ sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun。反射.DelegatingMethodAccessorImpl.invoke(未知源)
在java.lang.reflect.Method.invoke(未知源)
在org.hibernate.property.BasicPropertyAccessor $ BasicGetter.get(BasicPropertyAccessor.java:169)
... 32 more


解决方案

已将证书映射为证书对象的集合:

 < set名称=证书casca DE = 所有 > 
< key column =id>< / key>
< / set>

但是在你的测试中加入 String s到那个集合:

 设置证书=新的HashSet(); 
certificate.add(BE);
certificate.add(MBA);
certificate.add(BCA);

Java的泛型可以帮助您在编译时识别这些错误,所以更好地指定您使用的集合的元素类型,因此在添加错误的元素类型时会出现编译错误:

  private设置< Certificate> ;证书; 


I am new to HIbernate and was practicing some examples on One-to-many mapping but I am not getting why it is 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(); 
        }
        finally
        {
            session.close();
        }
    }

}

And I have created table Employee and 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 i am getting below error.

Hibernate: insert into Employee (id, name) values (default, ?)
apr 14, 2014 6:34:35 EM org.hibernate.property.BasicPropertyAccessor$BasicGetter get
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
    at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:192)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:346)
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4740)
    at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4459)
    at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:243)
    at org.hibernate.event.internal.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:511)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:100)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:680)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:672)
    at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:235)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:352)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:295)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161)
    at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:381)
    at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:321)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:298)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:118)
    at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:460)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:294)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:711)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:703)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:698)
    at com.common.mainapp.TestApp.addEmployee(TestApp.java:74)
    at com.common.mainapp.TestApp.main(TestApp.java:52)
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:169)
    ... 32 more

解决方案

You've mapped the certificates as set of Certificate objects:

   <set name="certificate" cascade="all">
      <key column="id"></key>
      <one-to-many class="com.common.pojo.Certificate" />
   </set>

but in your test you add Strings to that set:

    Set certificate =new HashSet();
    certificate.add("BE");
    certificate.add("MBA");
    certificate.add("BCA");

Java's generics help you recognizing such errors on compile time, so better specify the element type of the collections you use, so you get a compilation error when adding the wrong element types:

private Set<Certificate> certificate;

这篇关于对象不是声明类-Hibernate的实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆