2010-05-06 23 views
6

Mam do czynienia z problemem z Hibernate i JPA. Moje wymaganie to kolumna CreatedDTTM i LastUPDATEDDTTM powinna być wypełniona na poziomie DB. Próbowałem podążać, ale bezużytecznie. Moje kolumny są ustawione NIE NULL. Otrzymuję wyjątek "nie można wstawić wartości Null do LastUpdatedDttm". Wszelkie wskazówki są mile widziane.JPA: kolumny generowane przez bazę danych

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

Odpowiedz

7

Nie można odtworzyć. Przetestowałem następujące jednostki na 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 
} 

I dodaje metoda badania przechodzi:

Poniżej wygenerowany SQL:

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

Wszystko działa zgodnie z oczekiwaniami.

Moja rada: sprawdź DDL swojej tabeli, sprawdź, czy rzeczy działają z surowym SQL INSERT. Podejrzewam problem na poziomie bazy danych, a nie na poziomie hibernacji.

+0

Dzięki za odpowiedź. Masz rację, nie ustawiłem DEFAULT SYSDATE na poziomie DDL. Ale teraz wpadłem na inny problem. Ustawiłem UPDATABLE = true dla LastUPdatedDttm, ale nadal nie jest częścią instrukcji aktualizacji generowanych przez hibernację. Potrzebuję LastUpdateDDttm do aktualizacji przez SYSDATE, gdy reocrd jest aktualizowany. – jpanewbie

+0

@jpanewbie Czy możesz zamieścić to jako osobne pytanie? Najlepszą praktyką jest nie mieszanie problemów w jednym pytaniu. Dzięki. –

+0

zrobione. Czy możesz teraz pomóc? – jpanewbie

Powiązane problemy