JPA의 열에 대한 기본값 설정
JPA에서 열의 기본값을 설정할 수 있으며 주석을 사용하여 어떻게 수행됩니까?
다음을 수행할 수 있습니다.
@Column(name="price")
private double price = 0.0;
네! 방금 기본값으로 0을 사용했습니다.
이 응용 프로그램에서 데이터베이스에만 액세스하는 경우 유용합니다.다른 응용 프로그램에서도 데이터베이스를 사용하는 경우 Cameron의 columnDefinition 주석 속성을 사용하거나 다른 방법을 사용하여 데이터베이스에서 이 검사를 수행해야 합니다.
에서는 조금 하지만, JPA에서는 약간 해킹이 합니다.columnDefinition의 of의 @Column 예를 다음과 같이 합니다.
@Column(name="Price", columnDefinition="Decimal(10,2) default '100.00'")
또 다른 접근법은 javax.consence를 사용하는 것입니다.프리퍼지스트
@PrePersist
void preInsert() {
if (this.createdTime == null)
this.createdTime = new Date();
}
2. 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은 꽤 오랫동안 존재했음을 나타냅니다)
- 데이터베이스 기본값에 대한 최대 절전 모드 설명서 열
두 가지 주의사항:
이 되는 것을 마세요.1) 비표준이 되는 것을 두려워하지 마세요.JBoss 개발자로 일하면서 저는 사양 프로세스를 꽤 많이 보았습니다.사양은 기본적으로 특정 분야의 대기업들이 향후 10년 정도 지원을 약속하는 기준입니다.보안이나 메시징에 있어서 ORM은 큰 차이가 없습니다(JPA는 많은 부분을 커버합니다).개발자로서 저의 경험은 복잡한 애플리케이션에서는 조만간 비표준 API가 필요하다는 것입니다. ★★★★★★★★★★★★★★★★★.@ColumnDefault는 비표준 솔루션 사용의 단점보다 중요한 예입니다.
2) 누구나 @PrePersist나 컨스트럭터 멤버의 초기화를 흔드는 것이 좋습니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★"SQL" "SQL" "SQL" "SQL" "SQL" "SQL" "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 자동 박스는 많은 도움이 됩니다.
같은 문제를 해결하려다 우연히 구글에서 발견한 것을 보고 누군가 유용하다고 생각할 경우를 대비해서 제가 만든 해결책을 제시하려고 합니다.
제 관점에서는 이 문제에 대한 해결책은 @PrePersist라는 딱 하나밖에 없습니다.@PrePersist에서 실행할 경우 값이 이미 설정되어 있는지 확인해야 합니다.
@Column(columnDefinition="tinyint(1) default 1")
방금 문제를 테스트했습니다.그것은 잘 작동한다.힌트 고마워요.
코멘트에 대해서:
@Column(name="price")
private double price = 0.0;
이것은 데이터베이스의 기본 열 값을 설정하지 않습니다(물론).
Java reflect api를 사용할 수 있습니다.
@PrePersist
void preInsert() {
PrePersistUtil.pre(this);
}
이것은 일반적입니다.
public class PrePersistUtil {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public static void pre(Object object){
try {
Field[] fields = object.getClass().getDeclaredFields();
for(Field field : fields){
field.setAccessible(true);
if (field.getType().getName().equals("java.lang.Long")
&& field.get(object) == null){
field.set(object,0L);
}else if (field.getType().getName().equals("java.lang.String")
&& field.get(object) == null){
field.set(object,"");
}else if (field.getType().getName().equals("java.util.Date")
&& field.get(object) == null){
field.set(object,sdf.parse("1900-01-01"));
}else if (field.getType().getName().equals("java.lang.Double")
&& field.get(object) == null){
field.set(object,0.0d);
}else if (field.getType().getName().equals("java.lang.Integer")
&& field.get(object) == null){
field.set(object,0);
}else if (field.getType().getName().equals("java.lang.Float")
&& field.get(object) == null){
field.set(object,0.0f);
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
}
용 i i i i를 쓴다.columnDefinition가 좋습니다.
@Column(columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
private Date createdDate;
열 주석으로는 이 작업을 수행할 수 없습니다.오브젝트 작성 시 디폴트값을 설정하는 방법밖에 없다고 생각합니다.기본 생성자가 적절한 위치일 수 있습니다.
코드를 수정하여 했습니다.@DefaultValue:
commit 34199cba96b6b1dc42d0d19c066bd4d119b553d5
Author: Lenik <xjl at 99jsj.com>
Date: Wed Dec 21 13:28:33 2011 +0800
Add default-value ddl support with annotation @DefaultValue.
diff --git a/hibernate-core/src/main/java/org/hibernate/annotations/DefaultValue.java b/hibernate-core/src/main/java/org/hibernate/annotations/DefaultValue.java
new file mode 100644
index 0000000..b3e605e
--- /dev/null
+++ b/hibernate-core/src/main/java/org/hibernate/annotations/DefaultValue.java
@@ -0,0 +1,35 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+
+/**
+ * Specify a default value for the column.
+ *
+ * This is used to generate the auto DDL.
+ *
+ * WARNING: This is not part of JPA 2.0 specification.
+ *
+ * @author 谢继雷
+ */
+@java.lang.annotation.Target({ FIELD, METHOD })
+@Retention(RUNTIME)
+public @interface DefaultValue {
+
+ /**
+ * The default value sql fragment.
+ *
+ * For string values, you need to quote the value like 'foo'.
+ *
+ * Because different database implementation may use different
+ * quoting format, so this is not portable. But for simple values
+ * like number and strings, this is generally enough for use.
+ */
+ String value();
+
+}
diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3Column.java b/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3Column.java
index b289b1e..ac57f1a 100644
--- a/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3Column.java
+++ b/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3Column.java
@@ -29,6 +29,7 @@ import org.hibernate.AnnotationException;
import org.hibernate.AssertionFailure;
import org.hibernate.annotations.ColumnTransformer;
import org.hibernate.annotations.ColumnTransformers;
+import org.hibernate.annotations.DefaultValue;
import org.hibernate.annotations.common.reflection.XProperty;
import org.hibernate.cfg.annotations.Nullability;
import org.hibernate.mapping.Column;
@@ -65,6 +66,7 @@ public class Ejb3Column {
private String propertyName;
private boolean unique;
private boolean nullable = true;
+ private String defaultValue;
private String formulaString;
private Formula formula;
private Table table;
@@ -175,7 +177,15 @@ public class Ejb3Column {
return mappingColumn.isNullable();
}
- public Ejb3Column() {
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ public void setDefaultValue(String defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
+ public Ejb3Column() {
}
public void bind() {
@@ -186,7 +196,7 @@ public class Ejb3Column {
}
else {
initMappingColumn(
- logicalColumnName, propertyName, length, precision, scale, nullable, sqlType, unique, true
+ logicalColumnName, propertyName, length, precision, scale, nullable, sqlType, unique, defaultValue, true
);
log.debug( "Binding column: " + toString());
}
@@ -201,6 +211,7 @@ public class Ejb3Column {
boolean nullable,
String sqlType,
boolean unique,
+ String defaultValue,
boolean applyNamingStrategy) {
if ( StringHelper.isNotEmpty( formulaString ) ) {
this.formula = new Formula();
@@ -217,6 +228,7 @@ public class Ejb3Column {
this.mappingColumn.setNullable( nullable );
this.mappingColumn.setSqlType( sqlType );
this.mappingColumn.setUnique( unique );
+ this.mappingColumn.setDefaultValue(defaultValue);
if(writeExpression != null && !writeExpression.matches("[^?]*\\?[^?]*")) {
throw new AnnotationException(
@@ -454,6 +466,11 @@ public class Ejb3Column {
else {
column.setLogicalColumnName( columnName );
}
+ DefaultValue _defaultValue = inferredData.getProperty().getAnnotation(DefaultValue.class);
+ if (_defaultValue != null) {
+ String defaultValue = _defaultValue.value();
+ column.setDefaultValue(defaultValue);
+ }
column.setPropertyName(
BinderHelper.getRelativePath( propertyHolder, inferredData.getPropertyName() )
diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java b/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java
index e57636a..3d871f7 100644
--- a/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java
+++ b/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java
@@ -423,6 +424,7 @@ public class Ejb3JoinColumn extends Ejb3Column {
getMappingColumn() != null ? getMappingColumn().isNullable() : false,
referencedColumn.getSqlType(),
getMappingColumn() != null ? getMappingColumn().isUnique() : false,
+ null, // default-value
false
);
linkWithValue( value );
@@ -502,6 +504,7 @@ public class Ejb3JoinColumn extends Ejb3Column {
getMappingColumn().isNullable(),
column.getSqlType(),
getMappingColumn().isUnique(),
+ null, // default-value
false //We do copy no strategy here
);
linkWithValue( value );
음, 이건 겨울잠 전용 해결책이야.
@Column(columnDefinition='...')데이터를 삽입하는 동안 데이터베이스에서 기본 제약 조건을 설정하면 작동하지 않습니다.insertable = falsecolumnDefinition='...'그러면 데이터베이스가 자동으로 데이터베이스에서 기본값을 삽입합니다.- 예: 데이터베이스에서 varchar 성별을 기본적으로 남성으로 설정하는 경우.
- 더하면 요.
insertable = falseJΩ합니다.PA, 잘 pa 、 pa pa pa 。
@PrePersist
void preInsert() {
if (this.dateOfConsent == null)
this.dateOfConsent = LocalDateTime.now();
if(this.consentExpiry==null)
this.consentExpiry = this.dateOfConsent.plusMonths(3);
}
내 경우 필드가 LocalDateTime이기 때문에 벤더에 의존하지 않기 때문에 권장됩니다.
이것은 JPA에서는 불가능합니다.
Column 주석으로 수행할 수 있는 작업은 다음과 같습니다.
더블을 사용하는 경우 다음을 사용할 수 있습니다.
@Column(columnDefinition="double precision default '96'")
private Double grolsh;
네, DB에 한정되어 있습니다.
JPA 주석과 휴지 상태 주석 모두 기본 열 값의 개념을 지원하지 않습니다.으로 하이버네이트를 기본값을 합니다.save() ★★★★★★★★★★★★★★★★★」update()디폴트로 하는 것과 같은 은, 테이블에과 비슷합니다.동면하다테이블에 행을 저장할 때 기본값을 설정하는 데이터베이스의 동작과 비슷합니다.
이 대체 답변이 시사하는 바와 같이 모델 클래스에서 기본값을 설정하는 것과 달리, 이 접근법은 또한 다음을 사용하는 기준 쿼리가Example오브젝트는 이전과 같이 계속 작동합니다.모델 클래스에서 늘 가능한 속성(비프라이머리 타입을 가진 속성)의 기본값을 설정하면 이전에는 늘이었기 때문에 무시했던 관련 컬럼이 더 이상 사용되지 않게 됩니다.
데이터베이스 디자이너 또는 테이블을 생성할 때 기본값을 정의할 수 있습니다.를 들어 SQL Server")로 할 수 .getDate()을 사용합니다.insertable=false에서는 이 합니다.JPA는 삽입 시 해당 열을 지정하지 않고 데이터베이스에서 값을 생성합니다.
같은 문제를 해결하기 위한 다른 방법을 찾았습니다.왜냐하면, 독자적인 오브젝트를 작성하고, 데이타베이스를 유지할 때, 디폴트치를 가지는 DDL을 존중하지 않기 때문입니다.
콘솔을 살펴보니 SQL이 생성되어 모든 필드에 삽입이 제공되지만 개체에서 값이 변경된 속성은 1개뿐입니다.
그래서 모델 클래스에 이 주석을 넣었습니다.
@DynamicInsert
가 데이터를 삽입할 때 프레임워크는 늘 값 또는 변경되지 않은 값을 삽입하지 않으므로 삽입 길이가 짧아집니다.
also 도 있다@DynamicUpdate석입니니다다
JPA/Hiberate 방법을 몇 가지 시도해 보았지만, 어느 것도 잘 되지 않는 것 같습니다.Oracle을 사용하고 있기 때문에 트리거 내에 "before trigger"를 생성하여 null로 설정한 경우 null로 설정합니다.
언급URL : https://stackoverflow.com/questions/197045/setting-default-values-for-columns-in-jpa
'programing' 카테고리의 다른 글
| HTTP POST를 실행하여 응답을 소비하는 간단한 C 예시 (0) | 2022.07.07 |
|---|---|
| C++ 프로그램에서 scanf()를 사용하는 것이 cin을 사용하는 것보다 빠릅니다. (0) | 2022.07.06 |
| 마운트되었지만 프로덕션 환경에서는 렌더링되지 않은 템플릿 태그(개발 환경에서는 렌더링됨):Nuxtjs Vuejs Vuetifyjs 롤업즈 (0) | 2022.07.06 |
| 'createElement' 기능을 사용할 때 소품 바인딩을 반응적으로 만드는 방법 (0) | 2022.07.06 |
| VueJ의 v-for에서 반복 요소 제거s (0) | 2022.07.06 |