使用: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的错误吗?
答案 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(...)
可以轻松修复它。