java.lang.ClassCastException:org.hibernate.action.DelayedPostInsertIdentifier无法强制转换为java.lang.Long

时间:2012-03-07 03:58:59

标签: java hibernate postgresql maven

使用:hibernate 3.6.2,maven 2,postgres 9。 我有必须工作的代码,但事实并非如此。当我启动功能测试时,我遇到了错误:

java.lang.ClassCastException:org.hibernate.action.DelayedPostInsertIdentifier无法强制转换为java.lang.Long

代码是一个标准的域模型:

实体:

@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@Entity
@Table(schema = "simulators", name = "mySimulator_card")
public class MySimulatorCard {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "account_number", unique = true, nullable = false)
    private String accountNumber;

等...

DAO:

public abstract class AbstractDao<E, PK extends Serializable> implements Dao<E, PK> {

    private EntityManager entityManager;

    public EntityManager getEntityManager() {
        return entityManager;
    }

    @PersistenceContext(unitName = "MySimulator")
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public abstract Class<E> getEntityClass();

    @Override
    public void persist(E e) {
        getEntityManager().persist(e);
    }

    @Override
    public E merge(E e) {
        return getEntityManager().merge(e);
    }

    @Override
    public void refresh(E e) {
        getEntityManager().refresh(e); //<-- some thing wroooong
    }

    @Override
    public void delete(E e) {
        getEntityManager().remove(e);
    }

等...

根据表格:

CREATE TABLE simulators.mySimulator_card
(
  id bigserial NOT NULL,
  account_number character varying(255) NOT NULL,

etc...

  CONSTRAINT mySimulator_card_pk PRIMARY KEY (id),
  CONSTRAINT mySimulator_card_account_fk FOREIGN KEY (account_id)
      REFERENCES simulators.mySimulator_account (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT mySimulator_card_currency_fk FOREIGN KEY (currency_id)
      REFERENCES simulators.mySimulator_currency ("name") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT mySimulator_card_product_fk FOREIGN KEY (product_id)
      REFERENCES simulators.mySimulator_product (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT mySimulator_account_account_number_uq UNIQUE (account_number),
  CONSTRAINT mySimulator_card_san_uq UNIQUE (san)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE simulators.mySimulator_card OWNER TO functional;

这是堆栈跟踪直到我的代码:

 at org.hibernate.type.descriptor.java.LongTypeDescriptor.unwrap(LongTypeDescriptor.java:36)
        at org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$1.doBind(BigIntTypeDescriptor.java:52)
        at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:91)
        at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:282)
        at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:277)
        at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1873)
        at org.hibernate.loader.Loader.bindParameterValues(Loader.java:1844)
        at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1716)
        at org.hibernate.loader.Loader.doQuery(Loader.java:801)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
        at org.hibernate.loader.Loader.loadEntity(Loader.java:2037)
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:86)
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:76)
        at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3293)
        at org.hibernate.event.def.DefaultRefreshEventListener.onRefresh(DefaultRefreshEventListener.java:151)
        at org.hibernate.event.def.DefaultRefreshEventListener.onRefresh(DefaultRefreshEventListener.java:62)
        at org.hibernate.impl.SessionImpl.fireRefresh(SessionImpl.java:1118)
        at org.hibernate.impl.SessionImpl.refresh(SessionImpl.java:1098)
        at org.hibernate.ejb.AbstractEntityManagerImpl.refresh(AbstractEntityManagerImpl.java:738)
        at org.hibernate.ejb.AbstractEntityManagerImpl.refresh(AbstractEntityManagerImpl.java:713)
        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.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365)
        at $Proxy153.refresh(Unknown Source)
        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.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
        at $Proxy82.refresh(Unknown Source)
        at com.goooogle.simulator.mysimulator.dao.AbstractDao.refresh(AbstractDao.java:42)

为什么呢?这是hibernate的错误吗?

4 个答案:

答案 0 :(得分:1)

我在执行save()时遇到了完全相同的异常。我通过纠正hibernate映射文件中的cascade选项解决了这个问题。我将它从“all-delete-orphan,save-update,delete”改为“save-update,delete,delete-orphan”,它对我有用。 希望它有所帮助。

答案 1 :(得分:0)

你的驱动程序和方言在你的hibernate.properties文件中是否正确?

hibernate.connection.driver_class = org.postgresql.Driver

hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html_single/#configuration-hibernatejdbc

答案 2 :(得分:0)

您没有在create table语句中将主键定义为IDENTITY。

id bigserial NOT NULL IDENTITY

答案 3 :(得分:0)

这个异常让我感到困惑,只是在使用JpaRepository的Spring Boot应用程序中发生了。

就我而言,这是在调用JpaRepostitory.findBySomeEntity时发生的。 SomeEntity 已使用JpaRepository.save(...)而非JpaRepository.saveAndFlush(...)保存在同一事务中。因此尚未设置其ID。

看起来Hibernate试图用未提交的保存交易中创建的DelayedPostInsertIdentifier替换丢失的实体id,即使它不能转换为id类型。

这是一个令人误解的异常。不错,saveAndFlush(...)可以轻松修复它。

相关问题