Hibernate로 기본 엔티티 속성 값을 설정하는 방법


답변:


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 2016 년

1
이 상황에서는 columnDefinition을 사용하지 않는 것이 좋습니다. 데이터베이스에서 다른 데이터베이스로 이식 할 수 없으므로 서버의 특정 SQL 언어를 알아야합니다.
pdem

데이터베이스 pojo 클래스에 @DynamicInsert를 추가해야합니다.
Reaz Murshed


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;
}

이 방법은 최대 절전 모드 아래의 데이터베이스 유형 / 버전에 의존하지 않습니다. 매핑 개체를 유지하기 전에 기본값이 설정됩니다.


setMyProperty귀하의 예에서 사용되지 않은 것으로 가정합니다 . 왜 포함합니까?
EndermanAPM

표준 java 속성 (공개 get / set 메소드가있는 개인 변수)에 대한 최대 절전 모드 주석의 예를 제공합니다. 한 가지 실수를 발견하고 수정했습니다 ... 문자열 유형의 set 메소드 인수가 누락되었습니다.
dbricman

30

필드의 기본값을 설정하는 것은 어떻습니까?

private String _foo = "default";

//property here
public String Foo

값을 전달하면 덮어 쓰고 그렇지 않으면 기본값이 있습니다.


8
@michali : 기본값의 역할이 값을 업데이트하지 못하게하지 않습니까?
Janusz Lenar

27

최대 절전 모드 주석 사용

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

고맙습니다, 작동합니다. 그러나 나는 테이블을 다시 만들어야했습니다.
야마시로 리온

1
이것은 현재 해결책에서 제안한대로 columnDefinition을 사용하는 실제 솔루션이어야하며 번거롭고 유형을 포함해야합니다. 내 의견으로는 @ColumnDefault 주석이 훨씬 쉽습니다.
judos

7

데이터베이스에서 수행하려는 경우 :

데이터베이스 (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"입니다.


Oracle에 문제점이 있습니다. 특성이 널이 아닌 경우 해당 값은 여전히 ​​기본값입니다. 실제 가치가 아닙니다.
youngzy

5

한 가지 해결책은 getter가 작업중 인 값이 null (또는 초기화되지 않은 상태)인지 확인하고 그 값과 같으면 기본값을 반환하는 것입니다.

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

엔티티 객체의 setter를 호출하는 매퍼를 사용하고 있습니다. 게터와 세터 모두에서 코드 스 니펫을 사용하는 데 단점이 있습니까?
Eric Francis

4

이것을 검색하고 열의 기본값에 대한 많은 답변을 찾았습니다 .SQL 테이블에 정의 된 기본값을 사용하려면 @Column Annotation에서 "insertable = false"를 사용하십시오 . 삽입 가능

@Column (이름 = columnName, 길이 = lengthOfColumn, 삽입 가능 = 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

테이블의 모든 열에서 기본값을 사용합니다. 그런 다음 @DynamicInserttrue 로 정의해야합니다 @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

나는 최대 절전 모드 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")

그러나 자바 앱에서 기본값을 설정하려는 경우 클래스 속성에서 다음과 같이 설정할 수 있습니다. private Integer attribute = 1;


-3

위의 제안은 작동하지만 주석이 getter 메소드에서 사용되는 경우에만 작동합니다. 멤버가 선언 된 위치에 주석이 사용되면 아무 일도 일어나지 않습니다.

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.