hibernate jpa entitymanager commit not writing obj

2019-07-20 16:51发布

问题:

I'm using hibernate JPA (without Spring) and it's working well, but I have come across a problem which has stumped me for the last 3 days.

I have written some generic DAO classes and am using them to persist my objects. They all work fine, except for one class of object which is not being persisted. No exceptions are thrown. I've tried debugging inside the hibernate code and found that the reason the entity is not being persisted is that in the org.hibernate.event.def.DefaultFlushListener onFlush() method, source.getPersistenceContext().getEntityEntries().size() == 0 so no flushing is performed. But I can't work out why that would be the case.

The classes in question look like this:

    @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;
}

pretty straightforward hibernate JPA stuff.

Here's another class:

@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;
}

the BatchBean interface is what allows me to use generic DAOs like this:

    public Long create(BatchBean newInstance) {
    getOpenEntityManager().persist(newInstance);
    logger.debug("hopefully created {} with id {}",newInstance.getTypeName(),newInstance.getId());
    return newInstance.getId(); 
}

Transactions are being handled manually. I've set the flush type to COMMIT (ie flush on commit) and when I've completed the persist, I do a commit. After the persist, then BatchTxn object has been assigned a primary key from the sequence. When I debug hibernate I can see that getPersistenceContext().getEntityEntries() returns an empty Map.

so the question is why the BatchTxn is not being persisted by the commit, when the BatchRuns, and 5 other classes which implement BatchBean, are?

I'm using hibernate 3.6.0 Final

回答1:

The only thing I saw that is suspected in your code is this in the BatchTxn class:

private long id;

This will be set automatically to zero. Maybe you should use Long (with a capital letter)?