Hibernate consulta termina en un error de sintaxis SQL

Prashant:

He creado un UserPreferencesfrijol. El ser clave principal idcolumna. 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 Kotlinpara 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.emailno es null. El auto-dllajuste en mis application.ymldecir update. Cuando se ejecuta este código, veo que Hibernategenera 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 Stringcomo valor por defecto, Hibernate es simplemente poner un espacio en blanco en la consulta generada. Asi que aqui están mis preguntas:

  1. Si esto se trata como un error en Hibernate?
  2. Cómo manejar esta situación en la que me gustaría tener una cadena vacía ""como valor por defecto de columna?
Bill Karwin:

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 @Columnanotació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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=213510&siteId=1
Recomendado
Clasificación