Estoy trabajando en la configuración de una base de datos MySQL y usando Hibernate y Play Framework para el backend. Tengo problemas con los ID de las entradas. Definí mi columna de identificación como VARCHAR(36) :
CREATE TABLE `logaritmical`.`users` ( `id` VARCHAR(36) NOT NULL, `username` TEXT NOT NULL, `email` TEXT NOT NULL, PRIMARY KEY (`id`), UNIQUE INDEX `id_UNIQUE` (`id` ASC) ); Ahora, la clase @Entity es así:
@Entity @Table(name = "users") public class UserDO { @Id @GeneratedValue(generator = "uuid2") @GenericGenerator(name = "uuid2", strategy = "uuid2") @Column(name = "id", updatable = false, nullable = false, columnDefinition = "VARCHAR(36)") private UUID id; @Column private String username; @Column private String email; } Al realizar la inserción, aparece el siguiente error: Incorrect string value: '\xEF\xA5!\x89\xF3K...' for column 'id' at row 1
Si cambio el tipo de columna y la definición de columna a BINARIO BINARY(16) , la inserción funciona, pero tiene la desventaja de que la identificación no es legible por humanos cuando se realizan selecciones.
Información adicional: persistence.xml se ve así:
<persistence-unit name="defaultPersistenceUnit" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <non-jta-data-source>DefaultDS</non-jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/> </properties> </persistence-unit> La configuración de la base de datos y las versiones de las bibliotecas tienen este aspecto: jpa.default=defaultPersistenceUnit "org.hibernate" % "hibernate-entitymanager" % "5.4.24.Final", "mysql" % "mysql-connector-java" % "8.0.22",
¿Qué se puede hacer para que el UUID funcione con VARCHAR ? ¿Hay algo que este olvidando?
Trate de usar la siguiente definición:
import org.hibernate.annotations.Type; @Entity @Table(name = "users") public class UserDO { @Id @GeneratedValue(generator = "uuid2") @GenericGenerator(name = "uuid2", strategy = "uuid2") @Column(name = "id", updatable = false, nullable = false, columnDefinition = "VARCHAR(36)") @Type(type = "uuid-char") private UUID id; // ... } Parece que el UUID de su dialecto se asigna de forma predeterminada al tipo básico uuid-binary .
PD Tenga en cuenta que guardar UUID PK como una cadena puede provocar problemas de rendimiento, como se explica en este artículo :
Aparte del costo de tamaño 9x (36 frente a 4 bytes para un int), las cadenas no se clasifican tan rápido como los números porque dependen de las reglas de intercalación.