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 값을 식별합니다.
- 최대 절전 모드 4.3 문서 (4.3 시간 동안 여기에 있음을 보여주기 위해 4.3)
- 데이터베이스 열의 기본값에 대한 최대 절전 모드 수동
그것에 대한 두 가지 메모 :
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;
이것은 데이터베이스의 기본 열 값을 설정 하지 않습니다 (물론).