web-dev-qa-db-ja.com

Hibernate saveを使用しながらDB側のデフォルト値を使用するにはどうすればよいですか?

デフォルト値がsysdateのDBの列があります。アプリ側で対応するプロパティに何も与えない間に、デフォルト値を挿入する方法を探しています。ところで、注釈ベースの構成を使用しています。

何かアドバイス?

39
BruceCui

default SYSDATE dbms-sideとして定義されているにもかかわらず、挿入時に日付列がnull値を取得する理由は、列のdefault値が次の場合にのみ使用されるためです。クエリで列に値が与えられていません。つまり、たとえnullが与えられていても、INSERT INTO文に現れてはなりません。

DBMS側でdefault SYSDATEを使用する場合は、列を取得するために @Columninsertable=falseを構成する必要がありますSQL INSERTsの。

@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 を使用した作成タイムスタンプと最終更新タイムスタンプ。

87
Xavi López

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;
17
rajadilipkolli

@Column定義にinsertable = falseを入れるだけです

詳細は link をご覧ください

3
MariemJab

または、POJOのプロパティを直接初期化できます。例:

//Java code property declaration

private String surname = "default";
0
Sparticles