Cómo establecer un valor de propiedad de entidad predeterminado con Hibernate

145

¿Cómo configuro un valor predeterminado en el campo Hibernate?

Dejell
fuente
3
¿Está utilizando el archivo de configuración XML o las anotaciones?
Bruno
2
La respuesta a continuación solo proporciona soluciones JPA, que es correcta, pero para obtener una solución Hibernate, consulte stackoverflow.com/questions/28107554/… que debe usar@ColumnDefault
pdem

Respuestas:

185

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 columnDefinitiondepende de la base de datos. Además, si elige esta opción, debe usarla dynamic-insert, por lo Hibernateque 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;

Petar Minchev
fuente
66
Con anotaciones: @ org.hibernate.annotations.Entity (dynamicInsert = true)
homaxto
9
Actualmente org.hibernate.annotations.Entityestá en desuso. @DynamicInsertLa anotación se debe utilizar en su lugar.
Jannis
1
No recomendaría usar columnDefinition para esta situación, esto no es portátil de una base de datos a otra, y necesita conocer el lenguaje SQL específico de su servidor.
pdem
@DynamicInsert debe agregarse en la clase de pojo de la base de datos.
Reaz Murshed
3
Recomiendo usar @ColumnDefault en lugar de columnDefinition ya que es más independiente de la base de datos docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/…
jalsh
35

Puede usar la @PrePersistanotació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.

dbricman
fuente
Dado que setMyPropertyno es usado por su ejemplo. ¿Por qué lo incluyes?
EndermanAPM
Solo doy el ejemplo de anotaciones de hibernación para la propiedad estándar de Java (variable privada con métodos públicos get / set). Noté y corregí un error ... Faltaba el tipo de cadena del método de conjunto argumet.
dbricman
30

¿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.

Tim Hoolihan
fuente
8
@michali: el rol de un valor predeterminado no impide actualizar el valor, ¿verdad?
Janusz Lenar
27

usar anotación de hibernación

@ColumnDefault("-1")
private Long clientId;
Mazen Embaby
fuente
Gracias, funciona. Pero tuve que recrear la mesa.
Yamashiro Rion
1
Esta debería ser la solución real, usar columnDefinition como lo propone la respuesta actual es una molestia y debe incluir el tipo. La anotación @ColumnDefault es mucho más fácil en mi opinión.
judos
7

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"

CSA
fuente
Hay un problema para Oracle: si la propiedad no es nula, su valor SIGUE siendo el valor predeterminado. No es el valor real.
youngzy
5

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;
}
Ian Dallas
fuente
Estoy usando un mapeador que llama al setter en mi objeto de entidad. ¿Hay un inconveniente en usar su fragmento de código tanto en el getter como en el setter?
Eric Francis
4

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.

Garvit Bansal
fuente
Esto funciona muy bien para columnas como "createdAt" donde siempre desea usar el valor predeterminado de la base de datos. ¡Gracias!
Michal Filip
4

Usa @ColumnDefault()anotaciones. Sin embargo, esto solo hiberna.

T3rm1
fuente
2

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;
Bojan Petkovic
fuente
2

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
...

}
IKavanagh
fuente
2

Para usar el valor predeterminado de cualquier columna de la tabla. entonces debe definir @DynamicInsertcomo 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;

}
Dilip Verma
fuente
2

Valor de propiedad de entidad predeterminado

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 createdOnatributo de entidad predeterminado en la hora actual, así:

@Column(
    name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();

Valor de columna predeterminado

Si está generando el esquema DDL con Hibernate, aunque esto no se recomienda, puede usar el columnDefinitionatributo de la @Columnanotació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 DEFAULTcláusula SQL en un script, en lugar de en una anotación JPA.

Para obtener más detalles sobre el uso de la @Generatedanotación, consulte este artículo .

Vlad Mihalcea
fuente
1

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;
Ala Messaoudi
fuente
0

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;

Edgencio Da Calista
fuente
-3

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