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
问题描述
我为我的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屋!