[java] JPA에서 열의 기본값 설정

JPA에서 열의 기본값을 설정할 수 있습니까? 그렇다면 주석을 사용하여 어떻게 수행합니까?



답변

실제로 JPA에서 가능하지만 주석 의 columnDefinition속성을 사용하는 약간의 해킹 은 다음과 @Column같습니다.

@Column(name="Price", columnDefinition="Decimal(10,2) default '100.00'")


답변

다음을 수행 할 수 있습니다.

@Column(name="price")
private double price = 0.0;

그곳에! 방금 기본값으로 0을 사용했습니다.

이 응용 프로그램에서만 데이터베이스에 액세스하는 경우이 기능이 제공됩니다. 다른 응용 프로그램도 데이터베이스를 사용하는 경우 Cameron의 columnDefinition 주석 속성 또는 다른 방법을 사용하여 데이터베이스에서이 검사를 수행해야합니다 .


답변

또 다른 접근법은 javax.persistence.PrePersist를 사용하는 것입니다.

@PrePersist
void preInsert() {
   if (this.createdTime == null)
       this.createdTime = new Date();
}


답변

2017 년에도 JPA 2.1 @Column(columnDefinition='...')에는 열의 리터럴 SQL 정의 만 넣을 수 있습니다. 이것은 상당히 융통성이 없으며 유형과 같은 다른 측면을 선언하여 해당 문제에 대한 JPA 구현의 견해를 단축시켜야합니다.

그러나 최대 절전 모드는 다음과 같습니다.

@Column(length = 4096, nullable = false)
@org.hibernate.annotations.ColumnDefault("")
private String description;

DDL을 통해 연관된 열에 적용 할 DEFAULT 값을 식별합니다.

그것에 대한 두 가지 메모 :

1) 비표준으로가는 것을 두려워하지 마십시오. JBoss 개발자로 일하면서 꽤 많은 사양 프로세스를 보았습니다. 사양은 기본적으로 주어진 분야의 대기업들이 향후 10 년 정도 동안 지원하기로 약속 한 기준입니다. 보안, 메시징, ORM은 차이가 없습니다 (JPA는 상당히 많은 것을 다루지 만). 개발자로서의 경험은 복잡한 응용 프로그램에서 조만간 비표준 API가 필요하다는 것입니다. 과@ColumnDefault 비표준 솔루션을 사용하는 것의 단점을 능가하는 예입니다.

2) 모두가 @PrePersist 또는 생성자 멤버 초기화를 흔들어 놓는 것이 좋습니다. 그러나 그것은 동일하지 않습니다. 대량 SQL 업데이트는 어떻습니까? 열을 설정하지 않은 문장은 어떻습니까? DEFAULT역할이 있으며 Java 클래스 멤버를 초기화하여 대체 할 수는 없습니다.


답변

JPA는이를 지원하지 않으며, 가능하다면 유용 할 것입니다. columnDefinition을 사용하는 것은 DB에 따라 다르며 많은 경우 허용되지 않습니다. 널 (NULL) 값을 갖는 레코드를 검색 할 때 클래스에서 기본값을 설정하는 것만으로는 충분하지 않습니다 (일반적으로 이전 DBUnit 테스트를 다시 실행할 때 발생 함). 내가하는 일은 이것입니다 :

public class MyObject
{
    int attrib = 0;

    /** Default is 0 */
    @Column ( nullable = true )
    public int getAttrib()

    /** Falls to default = 0 when null */
    public void setAttrib ( Integer attrib ) {
       this.attrib = attrib == null ? 0 : attrib;
    }
}

Java 자동 복싱은 그 점에서 많은 도움이됩니다.


답변

내가 똑같은 문제를 해결하려고 노력하면서 Google에서 이것을 우연히 보았을 때 누군가가 유용하다고 생각하는 경우 요리 한 솔루션을 던질 것입니다.

내 관점에서 볼 때,이 문제에 대한 해결책은 @PrePersist에 불과합니다. @PrePersist에서 그렇게하면 값이 이미 설정되어 있는지 확인해야합니다.


답변

@Column(columnDefinition="tinyint(1) default 1")

방금 문제를 테스트했습니다. 잘 작동합니다. 힌트 주셔서 감사합니다.


의견에 관하여 :

@Column(name="price")
private double price = 0.0;

이것은 데이터베이스의 기본 열 값을 설정 하지 않습니다 (물론).