Hibernateフィールドにデフォルト値を設定するにはどうすればよいですか?
@ColumnDefault
Hibernateフィールドにデフォルト値を設定するにはどうすればよいですか?
@ColumnDefault
回答:
実際のデータベースのデフォルト値が必要な場合は、次を使用しますcolumnDefinition
。
@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")
の文字列columnDefinition
はデータベースに依存することに注意してください。また、このオプションを選択する場合はを使用する必要があるためdynamic-insert
、挿入時に値をHibernate
含む列を含めないnull
でください。それ以外の場合、デフォルトについて話すことは無関係です。
しかし、データベースのデフォルト値が必要ではなく、Javaコードのデフォルト値が必要な場合は、そのように変数を初期化するだけです- private Integer myColumn = 100;
org.hibernate.annotations.Entity
非推奨です。@DynamicInsert
代わりにアノテーションを使用する必要があります。
@PrePersist
アノテーションを使用して、事前永続化段階でデフォルト値を設定できます。
そんな感じ:
//... some code
private String myProperty;
//... some code
@PrePersist
public void prePersist() {
if(myProperty == null) //We set default value in case if the value is not set yet.
myProperty = "Default value";
}
// property methods
@Column(nullable = false) //restricting Null value on database level.
public String getMyProperty() {
return myProperty;
}
public void setMyProperty(String myProperty) {
this.myProperty= myProperty;
}
このメソッドは、Hibernateの下のデータベースタイプ/バージョンに依存しません。デフォルト値は、マッピングオブジェクトを永続化する前に設定されます。
setMyProperty
があなたの例で使われていないことを考えると。なぜそれを含めるのですか?
フィールドのデフォルト値を設定するだけではどうですか?
private String _foo = "default";
//property here
public String Foo
それらが値を渡すと、それは上書きされます。そうでなければ、デフォルトがあります。
データベースで実行したい場合:
データベースにデフォルト値を設定します(SQLサーバーのサンプル):
ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] DEFAULT (newid()) FOR [COLUMN_NAME]
休止状態ファイルのマッピング:
<hibernate-mapping ....
...
<property name="fieldName" column="columnName" type="Guid" access="field" not-null="false" insert="false" update="false" />
...
参照してください、キーはinsert = "false" update = "false"です
1つの解決策は、操作している値がnull(または初期化されていない状態の値)であるかどうかをゲッターに確認させ、それと等しい場合は、デフォルト値を返すことです。
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
これを検索したところ、列のデフォルト値に対する多くの回答が見つかりました。SQLテーブルで定義されているデフォルト値を使用する場合は、@ Columnアノテーションで" insertable = false"を使用します。挿入可能
@Column(name = columnName、length = lengthOfColumn、insertable = false)
columnDefinationを使用している場合、@ Columnアノテーションはデータベースに依存しているため機能しない可能性があります。
Oracleを使用して、Enumのデフォルト値を挿入しようとしました
私は以下が最もうまく機能することを発見しました。
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
テーブルの任意の列のデフォルト値を使用します。次に@DynamicInsert
、trueとして定義する必要があります@DynamicInsert
。休止状態はデフォルトでtrueと見なされるためです。与えられた例として考えてみましょう:
@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {
@Column(name = "status", columnDefinition = "int default 100")
private Long status;
}
デフォルトのエンティティプロパティ値を設定する場合は、デフォルト値を使用してエンティティフィールドを初期化できます。
たとえば、次のように、デフォルトのcreatedOn
エンティティ属性を現在の時間に設定できます。
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
HibernateでDDLスキーマを生成している場合、これはお勧めできませんが、次のようにcolumnDefinition
JPA @Column
アノテーションの属性を使用できます。
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@Generated
私たちは永続コンテキストがフラッシュされた後、それ以外の場合は、データベースが生成した値は、メモリ内のエンティティの状態と同期されることはありませんエンティティをリロードするために休止状態に指示したいので、注釈が必要とされています。
を使用する代わりに、columnDefinition
Flywayなどのツールを使用し、DDL増分移行スクリプトを使用することをお勧めします。このようにDEFAULT
して、JPAアノテーションではなくスクリプトでSQL句を設定します。
@Generated
アノテーションの使用について詳しくは、こちらの記事をご覧ください。
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
データベースの観点からデフォルト値を設定したい場合は、 @Column( columnDefinition = "int default 1")
ただし、Javaアプリでデフォルト値を設定する場合は、次のようにクラス属性に設定できます。 private Integer attribute = 1;
上記の提案は機能しますが、アノテーションがゲッターメソッドで使用されている場合のみです。メンバーが宣言されている場所で注釈が使用されている場合、何も起こりません。
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}