已传递给持久对象的分离实体

问题描述 投票:1回答: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

现在确保发布所有测试配置是一个好主意,因为有很多解决方法。有什么主意吗?

java spring hibernate entitymanager detach
1个回答
3
投票

[当您尝试将值保留在自动生成的列中时,会引发此错误。

检查您是否正在传递要保留为列ID的值,该值已标记为:

@@ GeneratedValue(strategy = GenerationType.IDENTITY)

问候

© www.soinside.com 2019 - 2024. All rights reserved.