2010-06-24 20 views
98

¿Cómo configuro el valor predeterminado en el campo Hibernación?Cómo establecer el valor predeterminado en Hibernar

+3

¿Está utilizando el archivo de configuración XML o las anotaciones? – Bruno

+1

La respuesta a continuación solo proporciona soluciones JPA, lo cual es correcto, pero para una solución de Hibernate, consulte http://stackoverflow.com/questions/28107554/define-default-column-value-with-annotations-in-hibernate. Debe usar '@ ColumnDefault' – pdem

Respuesta

131

Si desea un valor predeterminado de la base de datos real, use columnDefinition - @Column(name = "myColumn", nullable = false, columnDefinition = "int default 100"). Observe que la cadena en columnDefinition depende de la base de datos. Además, si elige esta opción, debe usar dynamic-insert, por lo que Hibernate no incluye columnas con valores de null en la inserción. De lo contrario, hablar de incumplimiento es irrelevante.

Pero si no desea que el valor por defecto de base de datos, sino simplemente un valor por defecto en el código Java, simplemente inicializar la variable de esa manera - private Integer myColumn = 100;

+5

Con anotaciones: @ org.hibernate.annotations.Entity (dynamicInsert = true) – homaxto

+4

Actualmente 'org.hibernate.annotations.Entity' está en desuso. La anotación '@ DynamicInsert' se debe usar en su lugar. – jannis

+0

No recomendaría usar columnDefinition para esta situación, esto no es portable de una base de datos a otra, y usted necesita saber el lenguaje SQL específico de su servidor. – pdem

23

¿qué tal simplemente 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.

+7

Esto no impide que se establezca en nulo en algún momento. – michali

+2

@michali: la función de un valor predeterminado no impide la actualización del valor, ¿o sí? –

5

Una solución es tener su cheque captador para ver si cualquier valor que está trabajando es nula (o cualquiera que sea su estado no inicializado sería) y si es igual a la que, simplemente volver a su valor por defecto:

public String getStringValue(){ 
    return (this.stringValue == null) ? "Default" : stringValue; 
} 
+0

Estoy usando un mapeador que llama al colocador en mi objeto de entidad. ¿Hay alguna desventaja en el uso del fragmento de código tanto en el getter como en el setter? –

6

Si desea hacerlo en la base de datos:

Establezca el valor predeterminado ue la base de datos (muestra de SQL Server):

ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] DEFAULT (newid()) FOR [COLUMN_NAME] 

la asignación del archivo de hibernación:

<hibernate-mapping .... 
    ...  
    <property name="fieldName" column="columnName" type="Guid" access="field" not-null="false" insert="false" update="false" /> 
    ... 

Sede, la clave está inserto = actualización de "falsa" = "false"

+0

Existe un problema para Oracle: si la propiedad no es nula, su valor STILL es el valor predeterminado. No es el valor real – youngzy

19

Puede usar @ Anotación PrePersist y establecer el valor predeterminado en la etapa de pre-persistir.

Algo así:

//... 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 es depende de la base de datos de tipo/versión por debajo de la hibernación. El valor predeterminado se establece antes de persistir el objeto de mapeo.

+0

Dado que 'setMyProperty' no es utilizado por su ejemplo. ¿Por qué lo incluyen? – EndermanAPM

+0

Acabo de dar el ejemplo de las anotaciones de hibernación para la propiedad java estándar (variable privada con métodos get/set públicos). Noté y corrigí un error ... Faltaba el tipo de cadena del método de configuración. – dbricman

5

La solución proporcionada anteriormente para fijar el valor por defecto utilizando Hibernate

@Column(name = “myColumn”, nullable = false, columnDefinition = “int default 100") 

es específica del proveedor y no funcionará para Oracle.

+3

Entonces, ¿cuál funcionaría para Oracle? – dade

+9

esto debería haber sido un comentario, no una respuesta – azerafati

-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 ocurrirá nada.

public String getStringValue(){ 
    return (this.stringValue == null) ? "Default" : stringValue; 
} 
1
<property name="age" type="integer"> 
<column name="age" not-null="false" default="null" /> 
</property> 
+5

¿Te importa [explica tu solución] (http://stackoverflow.com/help/how-to-reswer) un poco? Es posible que desee leer [Cómo escribir una buena respuesta] (http://stackoverflow.com/help/how-to-answer). –

3

Busqué esto y encontraron muchas respuestas al valor por defecto para column.If desea utilizar valor predeterminado definido en la tabla a continuación, en SQL @Column anotación utilizar "insertable = false" .insertable

@Column (nombre = columnName, longitud = lengthOfColumn, insertable = false)

Si está utilizando columnDefination que @Column anotación puede ser que no va a funcionar, ya que depende de la base de datos.

0

Trabajar con Oracle, que estaba tratando de insertar un valor por defecto para una enumeración

me encontré con lo siguiente para funcionar mejor.

@Column(nullable = false) 
@Enumerated(EnumType.STRING) 
private EnumType myProperty = EnumType.DEFAULT_VALUE; 
2

Puede usar el constructor de la clase 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 
... 

} 
2

Utilice @ColumnDefault() anotación. Sin embargo, esto es hibernación.

1

anotación uso de hibernación

@ColumnDefault("-1") 
private Long clientId; 
+0

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación. - [De la opinión] (/ reseña/mensajes de baja calidad/18356040) – Mamun

0

Si desea establecer el valor por defecto en cuanto a la base de datos, apenas se fija @Column(columnDefinition = "int default 1")

Pero si lo que se propone es establecer un valor por defecto en su aplicación java que pueda configúrelo en su atributo de clase como este: private Integer attribute = 1;

Cuestiones relacionadas