Я использую hibernate JPA (без весны), и он работает хорошо, но я столкнулся с проблемой, которая натолкнула меня на последние 3 дня.hibernate jpa entitymanager commit не записывает объекты в базу данных
Я написал несколько общих классов DAO и использую их для сохранения своих объектов. Все они работают нормально, за исключением одного класса объектов, который не сохраняется. Никакие исключения не выбрасываются. Я попытался отлаживать внутри спящего кода и обнаружил, что причина, по которой объект не сохраняется, заключается в том, что в методе org.hibernate.event.def.DefaultFlushListener onFlush()
source.getPersistenceContext().getEntityEntries().size() == 0
так не выполняется промывка. Но я не могу понять, почему это так.
Классы в вопросе выглядеть следующим образом:
@Entity
@Table(name="er_batch_runs")
public class BatchRun implements Serializable, Comparable<BatchRun>, BatchBean {
private Long runId;
private String hostname;
.... more field here
@Override
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="runseq")
@SequenceGenerator(name="runseq", sequenceName="er_batch_runs_seq", allocationSize=1 /*, initialValue = 10*/)
@Column(name="batch_run_id")
public Long getId() {
return runId;
}
public void setId(long runId) {
this.runId = runId;
}
@Column(name="hostname")
public String getHostname() {
return hostname;
}
public void setHostname(String hostname) {
this.hostname = hostname;
}
довольно простой Hibernate JPA вещи.
Вот еще один класс:
@Entity
@Table(name="er_batch_txns")
public class BatchTxn implements Serializable, Comparable<BatchTxn>, BatchBean {
private long id;
.......... more fields
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="batchtxnseq")
@SequenceGenerator(name="batchtxnseq", sequenceName="ER_BATCH_TXNS_SEQ", allocationSize=1/*00, initialValue = 10*/)
@Override
@Id
@Column(name="BATCH_TXN_ID")
public Long getId() {
return id;
}
интерфейс BatchBean является то, что позволяет мне использовать общие объекты DAO, как это:
public Long create(BatchBean newInstance) {
getOpenEntityManager().persist(newInstance);
logger.debug("hopefully created {} with id {}",newInstance.getTypeName(),newInstance.getId());
return newInstance.getId();
}
Операции решаются вручную. Я установил тип флеша COMMIT (т. Е. Flush on commit), и когда я завершил сохранение, я делаю фиксацию. После сохранения объект BatchTxn получает первичный ключ из последовательности. Когда я отлаживаю hibernate, я вижу, что getPersistenceContext(). GetEntityEntries() возвращает пустую карту.
поэтому вопрос в том, почему BatchTxn не сохраняется в результате фиксации, когда BatchRuns и 5 других классов, реализующих BatchBean, являются?
Я использую спящий режим 3.6.0 Final
Пожалуйста, добавьте код фиксации и очистки. Если транзакции обрабатываются вручную, то, пожалуйста, включите эту информацию тоже –
Вот код, выполняющий фиксацию: поскольку я обрабатываю транзакции вручную, я не закрываю EntityManager каждый раз: – mdarwin
'public static void commitTxnAndStartNewOne() \t { \t \t EntityManager em = getNonNullEntityManager(); \t \t \t, если (em.getTransaction(). IsActive()) {\t \t \t \t, если (em.getTransaction(). GetRollbackOnly()) {\t \t \t \t \t logger.info ("откат транзакции «); \t \t \t \t em.getTransaction().откат(); \t \t \t} \t еще \t { \t \t \t \t em.flush(); \t \t \t \t em.getTransaction(). Commit(); . \t \t \t} \t \t} \t \t em.getTransaction() начинается(); \t} ' – mdarwin