hibernate jpa entitymanager коммит не записывает объекты в базу данных - PullRequest
2 голосов
/ 20 декабря 2011

Я использую 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

1 Ответ

1 голос
/ 20 декабря 2011

Единственное, что я увидел в вашем коде, это то, что в классе BatchTxn:

приватный длинный идентификатор;

Это будет автоматически установлено на ноль. Может быть, вы должны использовать Long (с большой буквы)?

...