최대 절전 모드 필드에서 기본값을 어떻게 설정합니까?
@ColumnDefault
최대 절전 모드 필드에서 기본값을 어떻게 설정합니까?
@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;
}
이 방법은 최대 절전 모드 아래의 데이터베이스 유형 / 버전에 의존하지 않습니다. 매핑 개체를 유지하기 전에 기본값이 설정됩니다.
setMyProperty
귀하의 예에서 사용되지 않은 것으로 가정합니다 . 왜 포함합니까?
필드의 기본값을 설정하는 것은 어떻습니까?
private String _foo = "default";
//property here
public String Foo
값을 전달하면 덮어 쓰고 그렇지 않으면 기본값이 있습니다.
데이터베이스에서 수행하려는 경우 :
데이터베이스 (SQL Server 샘플)에서 기본값을 설정하십시오.
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"입니다.
한 가지 해결책은 getter가 작업중 인 값이 null (또는 초기화되지 않은 상태)인지 확인하고 그 값과 같으면 기본값을 반환하는 것입니다.
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
이것을 검색하고 열의 기본값에 대한 많은 답변을 찾았습니다 .SQL 테이블에 정의 된 기본값을 사용하려면 @Column Annotation에서 "insertable = false"를 사용하십시오 . 삽입 가능
@Column (이름 = columnName, 길이 = lengthOfColumn, 삽입 가능 = false)
columnDefination을 사용하는 경우 @Column 주석은 데이터베이스에 따라 작동하지 않을 수 있습니다.
테이블의 모든 열에서 기본값을 사용합니다. 그런 다음 @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 절을 설정하게됩니다 .
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
데이터베이스 측면에서 기본값을 설정하려면 설정하십시오. @Column( columnDefinition = "int default 1")
그러나 자바 앱에서 기본값을 설정하려는 경우 클래스 속성에서 다음과 같이 설정할 수 있습니다. private Integer attribute = 1;
위의 제안은 작동하지만 주석이 getter 메소드에서 사용되는 경우에만 작동합니다. 멤버가 선언 된 위치에 주석이 사용되면 아무 일도 일어나지 않습니다.
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}