2011-12-20 2 views
2

Я использую hibernate JPA (без весны), и он работает хорошо, но я столкнулся с проблемой, которая натолкнула меня на последние 3 дня.hibernate jpa entitymanager commit не записывает объекты в базу данных

Я написал несколько общих классов DAO и использую их для сохранения своих объектов. Все они работают нормально, за исключением одного класса объектов, который не сохраняется. Никакие исключения не выбрасываются. Я попытался отлаживать внутри спящего кода и обнаружил, что причина, по которой объект не сохраняется, заключается в том, что в методе 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(); 
} 

Операции решаются вручную. Я установил тип флеша COMMIT (т. Е. Flush on commit), и когда я завершил сохранение, я делаю фиксацию. После сохранения объект BatchTxn получает первичный ключ из последовательности. Когда я отлаживаю hibernate, я вижу, что getPersistenceContext(). GetEntityEntries() возвращает пустую карту.

поэтому вопрос в том, почему BatchTxn не сохраняется в результате фиксации, когда BatchRuns и 5 других классов, реализующих BatchBean, являются?

Я использую спящий режим 3.6.0 Final

+0

Пожалуйста, добавьте код фиксации и очистки. Если транзакции обрабатываются вручную, то, пожалуйста, включите эту информацию тоже –

+0

Вот код, выполняющий фиксацию: поскольку я обрабатываю транзакции вручную, я не закрываю EntityManager каждый раз: – mdarwin

+0

'public static void commitTxnAndStartNewOne() \t { \t \t EntityManager em = getNonNullEntityManager(); \t \t \t, если (em.getTransaction(). IsActive()) {\t \t \t \t, если (em.getTransaction(). GetRollbackOnly()) {\t \t \t \t \t logger.info ("откат транзакции «); \t \t \t \t em.getTransaction().откат(); \t \t \t} \t еще \t { \t \t \t \t em.flush(); \t \t \t \t em.getTransaction(). Commit(); . \t \t \t} \t \t} \t \t em.getTransaction() начинается(); \t} ' – mdarwin

ответ

1

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

частной длинной идентификатору;

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

+0

Хорошее место. Все, кроме одного из других объектов, которые сохраняются просто отлично, имеют это поле, установленное в Long. Я изменил его, и похоже, что это могло устранить проблему! Благодаря! – mdarwin

Смежные вопросы