使用:休眠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
现在确信它发布所有测试配置是一个好主意,因为有很多解决方法。 有什么想法?
如果您试图更新分离的对象,通常只会出现该错误。如果你的持久化方法需要处理创建和更新,那么你将需要使用实体管理器的“合并”功能。 – Perception 2012-04-16 04:26:18
你能澄清一下:你是说这段代码在生产(部署到服务器)上正常工作,但在运行集成测试(例如JUnit)时失败? – gutch 2012-04-16 04:39:02
是的,它工作在prodaction服务器(我被告知),但它不适用于功能测试(JUnit和testsng)。 – 2012-04-16 05:28:19