1. ホーム
  2. java

JPAタイムスタンプカラムをデータベースが生成するように設定する?

2023-09-19 14:01:33

質問

SQL Server 2000 データベースに、タイムスタンプ (データ型ではなく関数) 型のカラムがあります。 DATETIME という名前の lastTouched に設定されている getdate() をデフォルト値/バインディングとして設定します。

私はNetbeans 6.5で生成されたJPAエンティティクラスを使用しており、私のコードに次のようなものがあります。

@Basic(optional = false)
@Column(name = "LastTouched")
@Temporal(TemporalType.TIMESTAMP)
private Date lastTouched;

しかし、このオブジェクトをデータベースに入れようとすると、次のようになります。

javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: com.generic.Stuff.lastTouched

を設定してみましたが @Basic(optional = true) に変更する必要がありますが、これはデータベースが null の値は TIMESTAMP カラムの値として使用することができますが、これは設計上そうなっていません。

ERROR JDBCExceptionReporter - Cannot insert the value NULL into column 'LastTouched', table 'DatabaseName.dbo.Stuff'; column does not allow nulls. INSERT fails.

以前は純粋なHibernateでこれを動作させることができましたが、その後JPAに切り替えたため、このカラムがデータベース側で生成されることになっていることをどのように伝えればよいのかわからなくなってしまいました。なお、JPAの永続化レイヤーとしてHibernateを使用しています。

どのように解決するのですか?

この問題を解決するために、コードを

@Basic(optional = false)
@Column(name = "LastTouched", insertable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date lastTouched;

つまり、SQLインサートを生成する際に、タイムスタンプカラムは無視されます。これがベストな方法かどうかは分かりませんが。フィードバックは歓迎します。