¿Cómo se puede compartir un UUID como key principal en dos tablas usando Hibernate?

Estoy utilizando MySql como la database y el objective es almacenar el UUID generado en formatting Binario (16). En el DB tengo dos tablas:

  1. Para almacenar los detalles del usuario.
  2. Para almacenar la contraseña del usuario.

Tengo dos entidades UserDetails y UserLogin para representar estas tablas, respectivamente. Ellos son los siguientes:

Clase UserDetails:

package Entities import org.hibernate.annotations.GenericGenerator import org.hibernate.annotations.Type import java.io.Serializable import java.util.* import javax.persistence.* /** * class UserDetails */ @Entity @Table(name = "user_details") data class UserDetails( /** * The first name field for the user details table. */ @Column(name = "first_name") var firstName: String, /** * The last name field for the user details table. */ @Column(name = "last_name") var lastName: String, /** * The phone number field for the user details table. */ @Column(name = "phone_number") var phoneNumber: String, /** * The area code field for the user details table. */ @Column(name = "area_code") var areaCode: String, /** * The rating field for the user details table. */ @Column(name = "rating") var rating: Double, /** * The user login information containing the password for the user. */ @OneToOne(cascade = arrayOf(CascadeType.ALL), mappedBy = "user_id") @PrimaryKeyJoinColumn var userLogin: UserLogin ): Serializable { /** * The UserId field for the user details table. */ @Id @Type(type = "uuid-binary") @GeneratedValue(generator = "uuid2") @GenericGenerator(name = "uuid2", strategy = "uuid2") @Column(name = "user_id") lateinit var userId: UUID @Suppress("unused") constructor() : this("", "", "", "", 0.0, UserLogin()) companion object { @JvmStatic val serialVersionUID: Long = 1L } } 

Clase UserLogin:

 package Entities import java.io.Serializable import java.util.* import javax.persistence.* /** * class UserLogin * * This table is supposed to be temporary. The frontend has to run on mobile devices which will be using the OTP through * SMS to login to the app. Once that is done there is no need for this table and can be safely deleted w/o having to * modify a huge user_details table. * * @author niksinghal */ @Entity @Table(name = "user_login_details") data class UserLogin( /** * The password field for the login table. * It has to store the encrypted password. */ @Column(name = "password", nullable = false) var password: String ): Serializable { /** * The user ID field for the login table. * This value is a shanetworking primary key and it is populated by the UserDetails.userId field */ @Id @OneToOne lateinit var userId: UUID @Suppress("unused") constructor() : this("") companion object { @JvmStatic val serialVersionUID: Long = 1L } } 

El objective es tener una contraseña para cada fila de detalles de usuario (Asignación de OneToOne) y tener el mismo valor para las keys principales ID de usuario.

Estoy comstackndo esto y obteniendo: Invocación del método init fallido; la exception anidada es org.hibernate.AnnotationException: @OneToOne o @ManyToOne en Entities.UserLogin.userId hace reference a una entidad desconocida: java.utilmuneID

Soy muy nuevo en esto y hago todo esto estrictamente para aprender conceptos de Hibernate. Dicho esto, tengo entendido que el userId de la class UserDetails será generado por el generador. Las annotations @OneToOne & @PrimaryKeyJoinColumn encima de UserLogin de UserDetails deben insert el UUID generado en userIg de UserLogin, que nuevamente está marcado por @OneToOne.

Por favor, hágamelo saber por qué estoy recibiendo el error? ¿Y si podré almacenar el UUID en binary (16) en la database?

    La anotación de OneToOne se usa para asociar Entidades completas, no valores individuales. Debes decirle a Hibernate cómo debería generar tu key.

    Y existen SOF-Threads que respondieron su pregunta. Por ejemplo, este hilo

    Estaba haciendo muchas cosas mal aquí:

    • En primer lugar, estaba usando el mappedBy wrong. El valor de mappedBy tiene que ser un campo en la class o el nombre de la class con el nombre que comienza en minúscula. Estaba usando el nombre de la columna en la tabla actual.

    • En segundo lugar, estaba tratando de implementar la relación unidireccional 1-1 (lo aprendí más tarde) entre las dos tablas. El objective era compartir la key principal. Eso tiene que hacerse usando las annotations @OneToOne y @PrimaryKeyJoinColumn en el UserLogin en la class UserDetails.

    • En tercer lugar, Dexter tiene razón. @OneToOne se puede usar solo en Entidades.

    • En cuarto lugar, no había puesto una restricción en la tabla en DB.

      ¡Buenas noticias es que el UUID a binary funciona! ¡¡Hurra!!