Hibernate - 对象不是声明类的实例

时间:2016-02-19 11:48:04

标签: java hibernate

我有一个非常简单的实体:

import javax.persistence.*;

@Entity(name = "Message")
public class MessageEntity {

    private Long id;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return this.id;
    }

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

persistence.xml 包含hibernate.hbm2ddl.auto=create-drop,因此可以根据注释正确创建表。但是,当我坚持实体时,我得到以下异常:

org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of org.acme.project.MessageEntity.id
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:192) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:346) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4746) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4465) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:243) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:511) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:116) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:784) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1181) [hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final]
... 154 more
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.8.0_20]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [rt.jar:1.8.0_20]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.8.0_20]
at java.lang.reflect.Method.invoke(Method.java:483) [rt.jar:1.8.0_20]
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:169) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
... 165 more

或者当字段被注释而不是getter:

org.hibernate.PropertyAccessException: could not get a field value by reflection getter of org.acme.project.MessageEntity.id
at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:60) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:346) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4746) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4465) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:243) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:511) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:116) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:784) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1181) [hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final]
... 154 more
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field org.acme.project.MessageEntity.id to org.acme.project.MessageEntity
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) [rt.jar:1.8.0_20]
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) [rt.jar:1.8.0_20]
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58) [rt.jar:1.8.0_20]
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36) [rt.jar:1.8.0_20]
at java.lang.reflect.Field.get(Field.java:387) [rt.jar:1.8.0_20]
at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:57) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
... 165 more

产生异常的代码非常复杂,所以请花点时间真正理解它:

@PersistenceContext
private EntityManager em;

public void doMagic() {
    this.em.persist(new MessageEntity());
}

这可能是一个小而且非常愚蠢的错误,使得Hibernate认为它应该将ID设置为MessageEntity,但我似乎无法找到它的位置。有什么问题?

1 个答案:

答案 0 :(得分:0)

好的,这个例外远不是问题的原因。我在EAR中有一个WAR,而WAR在EAR中有重复的库。因此内部可能存在ClassCastException或其他内容,因为EAR中的bean无法使用WAR的对象。

相关问题