He creado un UserPreferences
frijol. El ser clave principal id
columna. Aquí está la definición del grano:
@Entity
public class UserPreferences {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(unique = true)
@ColumnDefault("")
private String id;
private String email;
// Getters and Setters
}
Ahora uso Kotlin
para insertar datos en este bean. Aquí está el código para hacerlo:
val newUserPreferences = UserPreferences().apply { email = newUserRequest.email }
mUserPreferenceService.save(newUserPreferences)
Vamos a suponer que newUserRequest.email
no es null
. El auto-dll
ajuste en mis application.yml
decir update
. Cuando se ejecuta este código, veo que Hibernate
genera siguiente consulta para la creación de la tabla:
create table user_preferences (
id varchar(255) default not null
email varchar(255),
primary key (id)
) engine=MyISAM
En este punto, la aplicación no se carga con el siguiente error:
Causado por: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Usted tiene un error en su sintaxis SQL; compruebe el manual que corresponde a su versión del servidor MariaDB para la sintaxis correcta a usar cerca 'no es nulo,
En cuanto a la excepción, es muy claro que el código está fallando porque en lugar de utilizar un vacío String
como valor por defecto, Hibernate es simplemente poner un espacio en blanco en la consulta generada. Asi que aqui están mis preguntas:
- Si esto se trata como un error en Hibernate?
- Cómo manejar esta situación en la que me gustaría tener una cadena vacía
""
como valor por defecto de columna?
No soy un usuario de hibernación, pero he encontrado https://github.com/hibernate/hibernate-orm/blob/master/documentation/src/test/java/org/hibernate/userguide/schema/ColumnDefaultTest.java espectáculos:
@ColumnDefault("'N/A'")
Parece que cuando se define un valor predeterminado para un tipo de cadena de SQL, debe utilizar delimitadores de cadenas SQL (comillas simples) dentro de la cadena de Java. En su caso, ya que desea una cadena vacía, tendrá que utilizar:
@ColumnDefault("''")
La otra manera de definir un valor por defecto es para establecer un atributo de la @Column
anotación, como se muestra en otra respuesta de desbordamiento de pila: Cómo establecer el valor por defecto en Hibernate
Así que esto no puede ser un error, pero es un uso de Hibernate que es contrario a la intuición para algunos usuarios, y tal vez no documentado claramente.
PS: Me considero como un error que todavía genera Hibernate CREATE TABLE con engine=MyISAM
menos que especifique el hibernate.dialect derecha . No es recomendable que el motor de almacenamiento. MyISAM es más lento que en la mayoría de los casos InnoDB, y no apoya ningún propiedades ACID. MySQL ha sido la eliminación gradual de MyISAM, y no recomiendo usarlo para cualquier proyecto actual.