Я использую hibernate JPA (без Spring), и он работает хорошо, но я столкнулся с проблемой, которая поставила меня в тупик в течение последних 3 дней.
Я написал несколько общих классов DAO, и яиспользуя их, чтобы сохранить мои объекты.Все они работают нормально, за исключением одного класса объектов, который не сохраняется.Никаких исключений не выбрасывается.Я попытался отладить код hibernate и обнаружил, что причина, по которой объект не сохраняется, заключается в том, что в методе 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;
}
довольно простые спящие материалы 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 (то есть сбрасывать при фиксации), и когда я завершил сохранение, я делаю фиксацию.После сохранения объекту BatchTxn был назначен первичный ключ из последовательности.Когда я отлаживаю hibernate, я вижу, что getPersistenceContext (). GetEntityEntries () возвращает пустую карту.
поэтому вопрос в том, почему BatchTxn не сохраняется коммитом, когда BatchRuns и 5 других классов, которые реализуют BatchBean, являются?
Я использую hibernate 3.6.0 Final