デフォルト値がsysdate
のDBの列があります。アプリ側で対応するプロパティに何も与えない間に、デフォルト値を挿入する方法を探しています。ところで、注釈ベースの構成を使用しています。
何かアドバイス?
default SYSDATE
dbms-sideとして定義されているにもかかわらず、挿入時に日付列がnull
値を取得する理由は、列のdefault
値が次の場合にのみ使用されるためです。クエリで列に値が与えられていません。つまり、たとえnull
が与えられていても、INSERT INTO
文に現れてはなりません。
DBMS側でdefault SYSDATE
を使用する場合は、列を取得するために @Column
でinsertable=false
を構成する必要がありますSQL INSERT
sの。
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "myDate", insertable=false)
private Date myDate;
このアプローチでは、エンティティの作成時にアプリのプロパティに指定した値が常に無視されることを考慮してください。時々日付を提供したい場合は、デフォルト値の代わりにDBトリガーを使用して値を設定することを検討してください。
DBMSのdefault SYSDATE
定義を使用する代わりの方法があります。 @PrePersist
および @PreUpdate
注釈を使用して、プロパティに現在の日付を割り当てることができます。まだ割り当てられていない場合にのみ、保存/更新します。
@PrePersist
protected void onCreate() {
if (myDate == null) { myDate = new Date(); }
}
この密接に関連した質問は、さまざまなアプローチを提供します: HibernateとMySQL を使用した作成タイムスタンプと最終更新タイムスタンプ。
Hibernateを使用している場合は、@CreationTimestamp
はデフォルトの日付を挿入します。
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_date")
private Date createDate;
および@UpdateTimestamp
必要に応じて値を更新する
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "modify_date")
private Date modifyDate;
@Column定義にinsertable = falseを入れるだけです
詳細は link をご覧ください
または、POJOのプロパティを直接初期化できます。例:
//Java code property declaration
private String surname = "default";