Hibernateでデフォルトのエンティティプロパティ値を設定する方法


145

Hibernateフィールドにデフォルト値を設定するにはどうすればよいですか?


3
XML構成ファイルまたは注釈を使用していますか?
Bruno

2
以下の答えは正しいJPAソリューションのみを示していますが、Hibernateソリューションについては、stackoverflow.com@ColumnDefault
questions / 28107554 /

回答:


185

実際のデータベースのデフォルト値が必要な場合は、次を使用しますcolumnDefinition

@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100") 

の文字列columnDefinitionはデータベースに依存することに注意してください。また、このオプションを選択する場合はを使用する必要があるためdynamic-insert、挿入時に値をHibernate含む列を含めないnullでください。それ以外の場合、デフォルトについて話すことは無関係です。

しかし、データベースのデフォルト値が必要ではなく、Javaコードのデフォルト値が必要な場合は、そのように変数を初期化するだけです- private Integer myColumn = 100;


6
注釈あり:@ org.hibernate.annotations.Entity(dynamicInsert = true)
homaxto

9
現在org.hibernate.annotations.Entity非推奨です。@DynamicInsert代わりにアノテーションを使用する必要があります。
jannis

1
この状況でcolumnDefinitionを使用することはお勧めしません。これはデータベース間での移植性がなく、サーバーの特定のSQL言語を知っている必要があります。
pdem

@DynamicInsertをデータベースpojoクラスに追加する必要があります。
Reaz Murshed 2017

3
それはより多くのデータベースは独立しているように私が代わりにcolumnDefinitionの@ColumnDefaultを使用してお勧めしますdocs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/...
jalsh

35

@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があなたの例で使われていないことを考えると。なぜそれを含めるのですか?
EndermanAPM 2017

標準のJavaプロパティ(パブリックのget / setメソッドを持つプライベート変数)のhibernateアノテーションの例を示します。私は1つの間違いに気付き、修正しました... setメソッドの引数の文字列型がありませんでした。
dbricman 2018

30

フィールドのデフォルト値を設定するだけではどうですか?

private String _foo = "default";

//property here
public String Foo

それらが値を渡すと、それは上書きされます。そうでなければ、デフォルトがあります。


8
@michali:デフォルト値の役割は値の更新を妨げていませんか?
Janusz Lenar 2016

27

休止状態の注釈を使用する

@ColumnDefault("-1")
private Long clientId;

ありがとうございます。しかし、テーブルを再作成する必要がありました。
山城リオン

1
これは実際の解決策である必要があります。現在の回答で提案されているcolumnDefinitionを使用するのは面倒であり、型を含める必要があります。注釈@ColumnDefaultは私の意見でははるかに簡単です。
柔道

7

データベースで実行したい場合:

データベースにデフォルト値を設定します(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"です


Oracleに問題があります。プロパティがnullでない場合、その値はデフォルト値のままです。実際の値ではありません。
youngzy '19年

5

1つの解決策は、操作している値がnull(または初期化されていない状態の値)であるかどうかをゲッターに確認させ、それと等しい場合は、デフォルト値を返すことです。

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}

私はエンティティオブジェクトのセッターを呼び出すマッパーを使用しています。ゲッターとセッターの両方でコードスニペットを使用することの欠点はありますか?
Eric Francis

4

これを検索したところ、列のデフォルト値に対する多くの回答が見つかりました。SQLテーブルで定義されているデフォルト値を使用する場合は、@ Columnアノテーションで" insertable = false"を使用します。挿入可能

@Column(name = columnName、length = lengthOfColumn、insertable = false)

columnDefinationを使用している場合、@ Columnアノテーションはデータベースに依存しているため機能しない可能性があります。


これは、常にDBのデフォルトを使用したい「createdAt」のような列に最適です。ありがとう!
Michal Filip

4

@ColumnDefault()注釈を使用します。ただし、これは休止状態です。


2

Oracleを使用して、Enumのデフォルト値を挿入しようとしました

私は以下が最もうまく機能することを発見しました。

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;

2

Javaクラスコンストラクターを使用して、デフォルト値を設定できます。例えば:

public class Entity implements Serializable{
 private Double field1
 private Integer field2;
 private T fieldN;

 public Entity(){
  this.field1=0.0;
  this.field2=0;
  ...
  this.fieldN= <your default value>
 }

 //Setters and Getters
...

}

2

テーブルの任意の列のデフォルト値を使用します。次に@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;

}

2

デフォルトのエンティティプロパティ値

デフォルトのエンティティプロパティ値を設定する場合は、デフォルト値を使用してエンティティフィールドを初期化できます。

たとえば、次のように、デフォルトのcreatedOnエンティティ属性を現在の時間に設定できます。

@Column(
    name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();

デフォルトの列値

HibernateでDDLスキーマを生成している場合、これはお勧めできませんが、次のようにcolumnDefinitionJPA @Columnアノテーションの属性を使用できます。

@Column(
    name = "created_on", 
    columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;

@Generated私たちは永続コンテキストがフラッシュされた後、それ以外の場合は、データベースが生成した値は、メモリ内のエンティティの状態と同期されることはありませんエンティティをリロードするために休止状態に指示したいので、注釈が必要とされています。

を使用する代わりに、columnDefinitionFlywayなどのツールを使用し、DDL増分移行スクリプトを使用することをお勧めします。このようにDEFAULTして、JPAアノテーションではなくスクリプトでSQL句を設定します。

@Generatedアノテーションの使用について詳しくは、こちらの記事をご覧ください。



1

私はhibernate 5とpostgresを使用していますが、これでうまくいきました。

@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;

0

データベースの観点からデフォルト値を設定したい場合は、 @Column( columnDefinition = "int default 1")

ただし、Javaアプリでデフォルト値を設定する場合は、次のようにクラス属性に設定できます。 private Integer attribute = 1;


-3

上記の提案は機能しますが、アノテーションがゲッターメソッドで使用されている場合のみです。メンバーが宣言されている場所で注釈が使用されている場合、何も起こりません。

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.