powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / java.lang.ClassCastException: org.hibernate.action.DelayedPostInsertIdentifier cannot be c
3 сообщений из 3, страница 1 из 1
java.lang.ClassCastException: org.hibernate.action.DelayedPostInsertIdentifier cannot be c
    #37694754
recvezitor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используется: hibernate 3.6.2, maven 2, postgres 9.
По идее код должен быть рабочий, но он, сюрприз-сюрприз, не работает. Когда запускаю функциональные тесты получаю ошибку:

java.lang.ClassCastException: org.hibernate.action.DelayedPostInsertIdentifier cannot be cast to java.lang.Long

Код - это стандартная доменная модель, вызов также не представляет чтото страшного:

Entity:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@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;


etc...

DAO:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
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);
        }


etc...

And according table:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
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;




Вот стек до нашего кода:



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
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)



Бага хибернейта?
...
Рейтинг: 0 / 0
java.lang.ClassCastException: org.hibernate.action.DelayedPostInsertIdentifier cannot be c
    #37695427
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема в том, что постгрес плохо работает с identity генератором. и полями bigserial, сам не сталкивался, но знакомые на что-то такое натыкались, вроде не бага хибернейта, или хз, в общем в интернете много статей - вы более в теме, поищите. Это если для объяснения, а для того чтобы пофиксить, может просто перейти на сиквенс генератор?
...
Рейтинг: 0 / 0
java.lang.ClassCastException: org.hibernate.action.DelayedPostInsertIdentifier cannot be c
    #37754941
recvezitor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
снова поднялся этот вопрос. Но теперь я изменил версию хибернейта и ошибка стала более логичной.
org.hibernate.PersistentObjectException: detached entity passed to persist: com.nxsystems.simulator.denarii.domain.DenariiCurrency
Очевидно, что дело в закрывшейся сессии Хибернейта. По документации написано, что, вызвав мердж, сессия вновь будет открыта и объект станет persistent. Мердж не помог.
тогда я где-то нарыл что вызвав в прнудилвку flush решит проблему. Поставил flush и он сказал, что No transaction in progress.
Тогда я попробовал обернуть это дело в такую порнушку:
// getEntityManager().getTransaction().begin();
getEntityManager().flush();
// getEntityManager().getTransaction().commit();

Опять неудача, сказало что нельзя так делать, когда пользуешься спрингом, мол используйте аннотацию @transactional.
Убрал закоментаренное, понатыкал везде где можно @Transactional, но вновь no transaction in progress.

Понятно что глюк с конфигурацией теста, потмоу что на продакшене это работает. НО другие то тесты работают, для других классов. Короче wtf?
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / java.lang.ClassCastException: org.hibernate.action.DelayedPostInsertIdentifier cannot be c
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]