¿Cómo configuro un valor predeterminado en el campo Hibernate?
@ColumnDefault
¿Cómo configuro un valor predeterminado en el campo Hibernate?
@ColumnDefault
Respuestas:
Si desea un valor predeterminado de base de datos real, use columnDefinition
:
@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")
Observe que la cadena de entrada columnDefinition
depende de la base de datos. Además, si elige esta opción, debe usarla dynamic-insert
, por lo Hibernate
que no incluye columnas connull
valores en la inserción. De lo contrario, hablar de incumplimiento es irrelevante.
Pero si no desea el valor predeterminado de la base de datos, sino simplemente un valor predeterminado en su código Java, simplemente inicialice su variable así: private Integer myColumn = 100;
org.hibernate.annotations.Entity
está en desuso. @DynamicInsert
La anotación se debe utilizar en su lugar.
Puede usar la @PrePersist
anotación y establecer el valor predeterminado en la etapa previa a la persistencia.
Algo como eso:
//... 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;
}
Este método no depende del tipo / versión de la base de datos debajo de Hibernate. El valor predeterminado se establece antes de persistir el objeto de mapeo.
setMyProperty
no es usado por su ejemplo. ¿Por qué lo incluyes?
¿Qué pasa con solo establecer un valor predeterminado para el campo?
private String _foo = "default";
//property here
public String Foo
si pasan un valor, se sobrescribirá, de lo contrario, tiene un valor predeterminado.
usar anotación de hibernación
@ColumnDefault("-1")
private Long clientId;
Si quieres hacerlo en la base de datos:
Establezca el valor predeterminado en la base de datos (muestra de servidor sql):
ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] DEFAULT (newid()) FOR [COLUMN_NAME]
Archivo de hibernación de mapeo:
<hibernate-mapping ....
...
<property name="fieldName" column="columnName" type="Guid" access="field" not-null="false" insert="false" update="false" />
...
Vea, la clave es insert = "false" update = "false"
Una solución es hacer que su getter verifique si el valor con el que está trabajando es nulo (o lo que sería su estado no inicializado) y si es igual a eso, simplemente devuelva su valor predeterminado:
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
Busqué esto y encontré muchas respuestas al valor predeterminado para la columna. Si desea usar el valor predeterminado definido en la Tabla SQL, entonces en @Column Annotation use "insertable = false" . insertable
@Column (nombre = columnName, longitud = lengthOfColumn, insertable = false)
Si está utilizando columnDefination, es posible que la anotación @Column no funcione, ya que depende de la base de datos.
Al trabajar con Oracle, intentaba insertar un valor predeterminado para una enumeración
Encontré lo siguiente para trabajar mejor.
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
Puede usar el constructor de clases java para establecer los valores predeterminados. Por ejemplo:
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
...
}
Para usar el valor predeterminado de cualquier columna de la tabla. entonces debe definir @DynamicInsert
como verdadero o, de lo contrario, simplemente define @DynamicInsert
. Porque hibernate toma por defecto como verdadero. Considere como el ejemplo dado:
@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {
@Column(name = "status", columnDefinition = "int default 100")
private Long status;
}
Si desea establecer un valor de propiedad de entidad predeterminado, puede inicializar el campo de entidad utilizando el valor predeterminado.
Por ejemplo, puede establecer el createdOn
atributo de entidad predeterminado en la hora actual, así:
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
Si está generando el esquema DDL con Hibernate, aunque esto no se recomienda, puede usar el columnDefinition
atributo de la @Column
anotación JPA , como este:
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
los @Generated
anotación es necesaria porque queremos indicarle a Hibernate que vuelva a cargar la entidad después de que se vacíe el Contexto de persistencia; de lo contrario, el valor generado por la base de datos no se sincronizará con el estado de la entidad en memoria.
En lugar de usar el columnDefinition
, es mejor usar una herramienta como Flyway y usar scripts de migración incremental DDL. De esa manera, establecerá la DEFAULT
cláusula SQL en un script, en lugar de en una anotación JPA.
Para obtener más detalles sobre el uso de la
@Generated
anotación, consulte este artículo .
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
Estoy trabajando con Hibernate 5 y Postgres, y esto funcionó.
@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;
Si desea establecer el valor predeterminado en términos de base de datos, simplemente configure @Column( columnDefinition = "int default 1")
Pero si lo que pretende es establecer un valor predeterminado en su aplicación Java, puede establecerlo en su atributo de clase de esta manera: private Integer attribute = 1;
La sugerencia anterior funciona, pero solo si la anotación se usa en el método getter. Si las anotaciones se usan donde se declara el miembro, no sucederá nada.
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}