JPAのデフォルトの列値
1. 概要
このチュートリアルでは、JPAのデフォルトの列値を調べます。
これらをエンティティのデフォルトプロパティとして設定する方法と、SQLテーブル定義で直接設定する方法を学習します。
2. エンティティの作成中
デフォルトの列値を設定する最初の方法は、エンティティプロパティ値として直接設定することです。
@Entity
public class User {
@Id
private Long id;
private String firstName = "John Snow";
private Integer age = 25;
private Boolean locked = false;
}
これで、 new 演算子を使用してエンティティを作成するたびに、指定したデフォルト値が設定されます。
@Test
void saveUser_shouldSaveWithDefaultFieldValues() {
User user = new User();
user = userRepository.save(user);
assertEquals(user.getName(), "John Snow");
assertEquals(user.getAge(), 25);
assertFalse(user.getLocked());
}
このソリューションには1つの欠点があります。
SQLテーブル定義を見ると、デフォルト値は表示されていません。
create table user
(
id bigint not null constraint user_pkey primary key,
name varchar(255),
age integer,
locked boolean
);
したがって、 nullでオーバーライドすると、エンティティはエラーなしで保存されます:
@Test
void saveUser_shouldSaveWithNullName() {
User user = new User();
user.setName(null);
user.setAge(null);
user.setLocked(null);
user = userRepository.save(user);
assertNull(user.getName());
assertNull(user.getAge());
assertNull(user.getLocked());
}
3. スキーマ定義内
SQLテーブル定義にデフォルト値を直接作成するには、 @Column アノテーションを使用して、columnDefinitionパラメーターを設定します。
@Entity
public class User {
@Id
Long id;
@Column(columnDefinition = "varchar(255) default 'John Snow'")
private String name;
@Column(columnDefinition = "integer default 25")
private Integer age;
@Column(columnDefinition = "boolean default false")
private Boolean locked;
}
このメソッドを使用すると、デフォルト値がSQLテーブル定義に存在します。
create table user
(
id bigint not null constraint user_pkey primary key,
name varchar(255) default 'John Snow',
age integer default 35,
locked boolean default false
);
また、エンティティはデフォルト値で適切に保存されます。
@Test
void saveUser_shouldSaveWithDefaultSqlValues() {
User user = new User();
user = userRepository.save(user);
assertEquals(user.getName(), "John Snow");
assertEquals(user.getAge(), 25);
assertFalse(user.getLocked());
}
このソリューションを使用すると、エンティティを初めて保存するときに、特定の列をnullに設定できないことに注意してください。 値を指定しない場合、デフォルトの値が自動的に設定されます。
4. 結論
この短い記事では、JPAでデフォルトの列値を設定する方法を学びました。
いつものように、完全なソースコードはGitHubでから入手できます。