hibernate jpa entitymanager提交不将对象写入数据库

时间:2011-12-20 16:00:40

标签: java hibernate jpa entitymanager

我正在使用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

1 个答案:

答案 0 :(得分:1)

我在代码中唯一怀疑的是BatchTxn类:

  

私人长身份;

这将自动设置为零。也许你应该使用Long(带大写字母)?