2012-04-16 70 views
1

使用:休眠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:通过坚持

代码分离的实体是一个非标准的域模型:

实体:

@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

如果您试图更新分离的对象,通常只会出现该错误。如果你的持久化方法需要处理创建和更新,那么你将需要使用实体管理器的“合并”功能。 – Perception 2012-04-16 04:26:18

+0

你能澄清一下:你是说这段代码在生产(部署到服务器)上正常工作,但在运行集成测试(例如JUnit)时失败? – gutch 2012-04-16 04:39:02

+0

是的,它工作在prodaction服务器(我被告知),但它不适用于功能测试(JUnit和testsng)。 – 2012-04-16 05:28:19

回答

3

当您尝试在自动生成的列中保留一个值时,会出现此错误。

检查,如果你传递一个值将持续列ID,您为其市场:

@GeneratedValue(strategy = GenerationType.IDENTITY)

问候。