2012-04-16 6 views
1

используется: hibernate 3.6.10, maven 2, postgres 9. У меня есть код, который должен работать, но это не так. , прежде чем я использовал спящий режим 3.6.2 и получил очень расстроенную ошибку: java.lang.ClassCastException: org.hibernate.action.DelayedPostInsertIdentifier не может быть приведен к java.lang.Longудаленный объект передан для сохранения

Но после обновления до 3.6.10 ошибок стал более разумно: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: отдельностоящий объект передается упорствовать

код является домен Standart модель:

Entity:

@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);//<-- some thing wroooong 
    } 

и т.д ...

И согласно таблице:

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; 

Я полагаю, что-то неправильно с контекстом в функциональных тестах, поскольку производство работа прекрасна. Кроме того, когда я пытался использовать этот трюк, чтобы получить сессию EntityManager:

EntityManager em = getEntityManager(); 
    HibernateEntityManager hem = em.unwrap(HibernateEntityManager.class); 
    Session session = hem.getSession(); 
    session.persist(e); 

Я получил ошибку:

java.lang.IllegalStateException: Нет транзакционной EntityManager доступного

Теперь уверена, что это хорошая идея, чтобы опубликовать все тестовые конфиги, потому что есть много обходных вещей. Любая идея?

+0

Обычно вы получите эту ошибку, если пытаетесь обновить отдельные объекты. Если ваш метод persist должен обрабатывать как создание, так и обновление, вам нужно будет использовать функцию 'merge'. – Perception

+0

Можете ли вы пояснить: вы говорите, что этот код работает правильно в производстве (развернут на сервер), но не работает при выполнении интеграционных тестов (например, JUnit)? – gutch

+0

Да, он работает на сервере prodaction (мне сказали так), но он не работает с функциональными тестами (JUnit и testsng). –

ответ

3

Эта ошибка возникает среди других, когда вы пытаетесь сохранить значение в столбце, автогенерируемом.

Проверьте, вы передаете значение сохраняется для идентификатора столбца, который вы имеете рынок как:

@GeneratedValue(strategy = GenerationType.IDENTITY)

С уважением.