当前位置: 首页 > 面试题库 >

Hibernate 4.3.6和Glassfish 4.0 JPA 2.1对象不是声明类的实例

桑博远
2023-03-14
问题内容

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

我的考试道课:

@PersistenceContext
private EntityManager entityManager;

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

和POJO类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>

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

例外是:

 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)

我在哪里做错了?

此项目在具有persistence.xml版本1.0(jpa)且没有此行的Glassfish 3.1上工作:

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

提前致谢


问题答案:

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

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

我将Hibernate版本更改为4.3.5,问题已解决 。Hibernate 4.3.6和4.3.7有相同的问题。这是由不同的类加载器引起的。Ejb
Classloader和Web应用程序Classloader是不同的。



 类似资料:
  • 问题内容: 我已经有一段时间没有接触过Mockito了,我也从未广泛使用它。但是今天,在一些新代码中,我想使用最佳实践,因此我使用以下Java版本退出了模仿内核2.0.54-beta: 我需要此接口的实例进行测试: https://bitbucket.org/globalmentor/rincl/src/bf0e8875a1bae16247dd904e0b8bc067c9f8abc9/src/ma

  • 我有一段时间没有接触过Mockito,也从来没有大量使用过它。但是今天在一些新代码中,我希望使用最佳实践,所以我使用以下Java版本推出了mockito-core 2.0.54-beta: 要重现此问题,请克隆https://bitbucket.org/globalmentor/rincl.git并签出commit2f88d7c5e5ac17b6d316ed54c12cb7b447b7d6ac。然

  • 问题内容: 这个问题在Google上到处都有,但我仍然遇到问题。这就是我想要做的。因此,就像标题状态一样,我遇到了“对象不是声明类的实例”错误。有任何想法吗?谢谢! Main.java TestFunction.java 问题答案: 您正在使用该类调用该方法,但需要一个实例。试试这个:

  • 我已经设置了一个Spring Boot项目,并使用castor xml依赖关系将POJO转换为xml。 在为POJO调用封送处理方法时遇到问题。我查阅了stackoverflow的其他相关问题,但没有一个能解决我的场景。 有一个toString方法,它位于Spring组件中。 以下是片段: 这是客户端内部的封送方法(castor之前自动生成的类): 以下是相同的堆栈跟踪: 这里需要注意的是,当我执

  • 用户类 我把这个复制方法叫做 并在执行writeMethod.invoke(dest,val)时获得以下异常。有人能帮忙吗? 对象不是在java.base/jdk.internal.reflect.nativeMethodAccessorImpl.Invoke0(原生方法)在java.base/jdk.internal.reflect.nativeMethodAccessorImpl.Invoke

  • 我有一个CookingEvent.class,它是Event.class的子类,hibernate继承策略是@ Inheritance(strategy = Inheritance type。已加入)。当我试图发送一个列表对象作为get响应时。我不例外 2016-08-25 11:49:22.351错误11944---[nio-8189-exec-1]o.a.c.c.c.[.[/]。[servle