Hibernate 4.3.6和Glassfish 4.0 JPA 2.1对象不是声明类的实例 [英] Hibernate 4.3.6 and Glassfish 4.0 JPA 2.1 object is not an instance of declaring class

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

问题描述

我为我的ejb项目使用Hibernate 4.3.6和Glassfish 4.0。



我的测试Dao类:

  @PersistenceContext 
私人EntityManager entityManager;

public void saveTest(){
Foo testFoo = new Foo();
testFoo.setSomething(test);
entityManager.persist(testFoo);
entityManager.flush();
}

和POJO class Foo.class:

  @Entity 
@Table(name =FOO)
公共类Foo实现Serializable {

private static最终的长串serialVersionUID = 1L;

私人长ID;

私人字符串的东西;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name =T_ID,unique = true,nullable = false,precision = 15,scale = 0)
public Long getId(){
return id;
}

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

@Column(name =T_SOMETHING,length = 50)
public String getSomething(){
return something;
}

public void setSomething(String something){
this.adi = something;


persistence.xml:

 <?xml version =1.0encoding =UTF-8?> 
< persistence xmlns =http://xmlns.jcp.org/xml/ns/persistence
xmlns:xsi =http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation =http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd
version =2.1>
< persistence-unit name =TestAppUnittransaction-type =JTA>
< provider> org.hibernate.jpa.HibernatePersistenceProvider< / provider>

< jta-data-source> jdbc / TestApp< / jta-data-source>

< class> com.example.test.Foo< / class>
< exclude-unlisted-classes> false< / exclude-unlisted-classes>
<属性>
< property name =hibernate.transaction.jta.platform
value =org.hibernate.service.jta.platform.internal.SunOneJtaPlatform/>
< property name =hibernate.dialectvalue =org.hibernate.dialect.Oracle9iDialect/>
< property name =hibernate.show_sqlvalue =true/>
< property name =hibernate.format_sqlvalue =true/>
< / properties>
< / persistence-unit>
< /余辉>

我可以列出表格数据,通过查询获取数据,并且我可以从表格中删除数据。但我不能坚持或合并。



例外情况是:

$ p $ 发生IllegalArgumentException异常调用com.example.test.Foo.id的getter $ or $ $ b $ org.hibernate.property.BasicPropertyAccessor $ BasicGetter.get(BasicPropertyAccessor.java:192)
org.hibernate.tuple.entity .AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:346)
at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4746)
at org.hibernate.persister.entity.AbstractEntityPersister.isTransient (AbstractEntityPersister.java:4465)
在org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:243)
在org.hibernate.event.internal.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java :511)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:100)
at org.hibernate.event.internal.DefaultS aveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:684)
at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java: 676)
在org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:671)
....

引起:java.lang.IllegalArgumentException:object is不是在sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)上声明类
的实例。在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
处的
。 DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.hibernate.property.BasicPropertyAccessor $ BasicGetter.get(BasicPropertyAccessor。 java:169)

我在哪里做错了?



这个项目使用persistenc在Glassfish 3.1上工作e.xml version 1.0(jpa)and without the line:

 < property name =hibernate.transaction.jta.platform 
value =org.hibernate.service.jta.platform.internal.SunOneJtaPlatform/>

预先致谢

解决方案

我找到了。也许别人遇到这个问题。我想分享解决方案。



由Hibernate和@PersistenceContext注释引起的问题。



我将Hibernate版本更改为4.3.5,并解决了问题。休眠4.3.6和4.3.7有同样的问题。这是由不同的类加载器引起的。 Ejb Classloader和web app Classloader是不同的。


I'm using Hibernate 4.3.6 and Glassfish 4.0 for my ejb project.

My test Dao class :

@PersistenceContext
private EntityManager entityManager;

public void saveTest(){
    Foo testFoo = new Foo();
    testFoo.setSomething("test");
    entityManager.persist(testFoo);
    entityManager.flush();
}

and POJO class Foo.class:

@Entity
@Table(name = "FOO")
public class Foo implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    private String something;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "T_ID", unique = true, nullable = false, precision = 15, scale = 0)
    public Long getId() {
        return id;
    }

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

    @Column(name = "T_SOMETHING", length = 50)
    public String getSomething() {
        return something;
    }

    public void setSomething(String something) {
        this.adi = something;
    }
}

persistence.xml :

 <?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
    http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
    version="2.1">
    <persistence-unit name="TestAppUnit" transaction-type="JTA">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <jta-data-source>jdbc/TestApp</jta-data-source>

        <class>com.example.test.Foo</class>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.transaction.jta.platform"
                value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

I can list table data, get data with query and i can remove data from table. But i can't persist or merge.

Exception is:

 IllegalArgumentException occurred calling getter of com.example.test.Foo.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:4746)
    at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4465)
    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:684)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:676)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:671)
....

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(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:169)

Where am I doing wrong?

This project working on Glassfish 3.1 with persistence.xml version 1.0(jpa) and without this line :

<property name="hibernate.transaction.jta.platform"
                    value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" />

Thanks in advance

解决方案

I found it. Maybe others they encounter this problem. I wanted to share the solution.

The problem caused from Hibernate and "@PersistenceContext" annotation.

I change to Hibernate version to 4.3.5 and problem solved. Hibernate 4.3.6 and 4.3.7 has same problem. It's caused by different classloaders. Ejb Classloader and web app Classloader is different.

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

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