2010-05-06 1 views
6

Sono di fronte a un problema con Hibernate e JPA. Il mio requisito è la colonna CreatedDTTM e LastUPDATEDDTTM deve essere compilata a livello di DB. Ho provato a seguire ma non usare. Le mie colonne sono impostate NOT NULL. Ottengo un'eccezione "impossibile inserire Null into LastUpdatedDttm". Qualsiasi consiglio è apprezzato.JPA: colonne generate dal database

@Column(name="LAST_UPDATED_DTTM", insertable=false, updatable=false, columnDefinition="Date default SYSDATE") 
@org.hibernate.annotations.Generated(value=GenerationTime.INSERT) 
@Temporal(javax.persistence.TemporalType.DATE) 
private Date lastUpdDTTM; 

@Column(name="CREATED_DTTM”, insertable=false, updatable=false) 
@org.hibernate.annotations.Generated(value=GenerationTime.ALWAYS) 
@Temporal(javax.persistence.TemporalType.DATE) 
private Date createdDTTM; 

risposta

7

Impossibile riprodurre. Ho provato la seguente entità su Derby:

@Entity 
public class EntityWithGeneratedField { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(name = "LAST_UPDATED_DTTM", insertable = false, updatable = false, 
      columnDefinition = "Date default CURRENT_DATE") 
    @org.hibernate.annotations.Generated(value = GenerationTime.INSERT) 
    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date lastUpdDTTM; 

    // getters, setters 
} 

E il seguente metodo di test viene superato:

Di seguito, l'SQL generato:

 
Hibernate: insert into EntityWithGeneratedField (id) values (?) 
Hibernate: select entitywith_.LAST_UPDATED_DTTM as LAST2_83_ from EntityWithGeneratedField entitywith_ where entitywith_.id=? 

Tutto funziona come previsto.

Il mio consiglio: controlla il DDL della tua tabella, controlla che tutto funzioni con un SQL INSERT raw. Sospetto un problema a livello di database, non a livello di Hibernate.

+0

Grazie per la risposta. Avevi ragione, non avevo impostato il SYSDATE DEFAULT a livello DDL. Ma ora mi sono imbattuto in un altro problema. Ho impostato UPDATABLE = true per LastUPdatedDttm ma non fa ancora parte delle istruzioni di aggiornamento generate da hibernate. Ho bisogno di LastUpdateDDttm per essere aggiornato da SYSDATE ogni volta che viene aggiornato il reocrd. – jpanewbie

+0

@jpanewbie Potresti postare questo come una domanda separata? È una buona pratica non mescolare i problemi in una singola domanda. Grazie. –

+0

fatto. Puoi per favore aiutare ora? – jpanewbie