我正在使用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;
}
非常简单的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();
}
正在手动处理交易。我已经将flush类型设置为COMMIT(即提交时刷新),当我完成持久化时,我做了提交。在持久化之后,然后为BatchTxn对象分配了序列中的主键。当我调试hibernate时,我可以看到getPersistenceContext()。getEntityEntries()返回一个空Map。
所以问题是,当BatchRuns和其他5个实现BatchBean的类是什么时,BatchTxn没有被提交持久化?
我正在使用hibernate 3.6.0 Final
答案 0 :(得分:1)
我在代码中唯一怀疑的是BatchTxn类:
私人长身份;
这将自动设置为零。也许你应该使用Long(带大写字母)?