¿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:
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;
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.
Puede usar la @PrePersistanotación y establecer el valor predeterminado en la etapa previa a la persistencia.
Algo como eso:
//... some codeprivateString myProperty;//... some code@PrePersistpublicvoid 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.publicString getMyProperty(){return myProperty;}publicvoid 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.
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?
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]
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:
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.
Puede usar el constructor de clases java para establecer los valores predeterminados. Por ejemplo:
publicclassEntityimplementsSerializable{privateDouble field1
privateInteger field2;private T fieldN;publicEntity(){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 @DynamicInsertcomo verdadero o, de lo contrario, simplemente define @DynamicInsert. Porque hibernate toma por defecto como verdadero. Considere como el ejemplo dado:
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")privateLocalDateTime 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)privateLocalDateTime 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 .
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.
@ColumnDefault
Respuestas:
Si desea un valor predeterminado de base de datos real, use
columnDefinition
:Observe que la cadena de entrada
columnDefinition
depende de la base de datos. Además, si elige esta opción, debe usarladynamic-insert
, por loHibernate
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;
fuente
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:
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.
fuente
setMyProperty
no es usado por su ejemplo. ¿Por qué lo incluyes?¿Qué pasa con solo establecer un valor predeterminado para el campo?
si pasan un valor, se sobrescribirá, de lo contrario, tiene un valor predeterminado.
fuente
usar anotación de hibernación
fuente
Si quieres hacerlo en la base de datos:
Establezca el valor predeterminado en la base de datos (muestra de servidor sql):
Archivo de hibernación de mapeo:
Vea, la clave es insert = "false" update = "false"
fuente
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:
fuente
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
Si está utilizando columnDefination, es posible que la anotación @Column no funcione, ya que depende de la base de datos.
fuente
Usa
@ColumnDefault()
anotaciones. Sin embargo, esto solo hiberna.fuente
Al trabajar con Oracle, intentaba insertar un valor predeterminado para una enumeración
Encontré lo siguiente para trabajar mejor.
fuente
Puede usar el constructor de clases java para establecer los valores predeterminados. Por ejemplo:
fuente
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:fuente
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
createdOn
atributo de entidad predeterminado en la hora actual, así:Valor de columna predeterminado
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: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á laDEFAULT
cláusula SQL en un script, en lugar de en una anotación JPA.fuente
fuente
Estoy trabajando con Hibernate 5 y Postgres, y esto funcionó.
fuente
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;
fuente
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.
fuente