используется: 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 доступного
Теперь уверена, что это хорошая идея, чтобы опубликовать все тестовые конфиги, потому что есть много обходных вещей. Любая идея?
Обычно вы получите эту ошибку, если пытаетесь обновить отдельные объекты. Если ваш метод persist должен обрабатывать как создание, так и обновление, вам нужно будет использовать функцию 'merge'. – Perception
Можете ли вы пояснить: вы говорите, что этот код работает правильно в производстве (развернут на сервер), но не работает при выполнении интеграционных тестов (например, JUnit)? – gutch
Да, он работает на сервере prodaction (мне сказали так), но он не работает с функциональными тестами (JUnit и testsng). –