Intereting Posts
Модуль библиотеки Android, разработанный в Kotlin, экспортируется в приложение Java, вызывающее неудачное разрешение: Lkotlin / jvm / internal / Intrinsics Преобразовать тип с нулевым значением в его тип, не содержащий NULL? Kotlin NoClassDefFoundError с помощью метода spring @RequestMapping SetChecked () не работает Предупреждение: предупреждение: поддерживаемая исходная версия 'RELEASE_7' из обработчика аннотаций 'android.arch.lifecycle.LifecycleProcessor' меньше, чем -source '1.8' onCreate crashing после преобразования с Java в Kotlin Кастинг JSONArray в Iterable <JSONObject> – Котлин Как использовать джексон для десериализации в коллекциях Котлина Ссылка на метод определения свойств Ошибка: выполнение выполнено для задачи ': app: kaptDemoTestingDebugKotlin' Как использовать дженерики в сопутствующем объекте Стилирование элементов HTML в Kotlin-js Kotlin с Spring DI: свойство lateinit не было инициализировано Веб-приложение Kotlin | ссылка css-файл Ошибка загрузки Spring Boot + Kotlin

Как можно использовать UUID в качестве первичного ключа в двух таблицах с помощью Hibernate?

Я использую MySql в качестве базы данных и хочу сохранить сгенерированный UUID в формате Binary (16). В БД есть две таблицы:

  1. Чтобы сохранить сведения о пользователе.
  2. Чтобы сохранить пароль пользователя.

У меня есть два объекта UserDetails и UserLogin для представления этих таблиц, соответственно. Они заключаются в следующем:

Класс 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 } } 

Класс 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 shared 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 } } 

Цель состоит в том, чтобы иметь один пароль для каждой детальной строки пользователя (OneToOne Mapping) и иметь то же значение для первичных ключей userId.

Я компилирую это и получаю – Invocation метода init не удалось; Вложенное исключение – org.hibernate.AnnotationException: @OneToOne или @ManyToOne на Entities.UserLogin.userId ссылается на неизвестный объект: java.util.UUID

Я очень новичок в этом и делаю все это, чтобы изучать концепции Hibernate. При этом я понимаю, что пользовательский идентификатор UserDetails будет генерироваться генератором. Аннотации @OneToOne & @PrimaryKeyJoinColumn над UserLogin UserDetails должны вытолкнуть сгенерированный UUID в userId UserLogin, который снова отмечен @OneToOne.

Пожалуйста, дайте мне знать, почему я получаю сообщение об ошибке? И если я смогу хранить UUID в двоичном формате (16) в БД?

    Аннотации OneToOne используются для связывания целых объектов, а не с одиночными значениями. Вам нужно сообщить Hibernate, как он должен генерировать ваш ключ.

    И есть существующие SOF-Threads, которые ответили на ваш вопрос. Например, эта тема

    Здесь я делал много не так:

    • Во-первых, я неправильно использовал mappedBy. Значение mappedBy должно быть полем в классе или именем класса с именем, начинающимся в нижнем регистре. Я использовал имя столбца в фактической таблице.

    • Во-вторых, я пытался реализовать однонаправленную связь 1-1 (я узнал об этом позже) между двумя таблицами. Цель состояла в том, чтобы поделиться первичным ключом. Это нужно сделать, используя аннотации @OneToOne и @PrimaryKeyJoinColumn в userLogin в классе UserDetails.

    • В-третьих, Декстер прав. @OneToOne можно использовать только для сущностей.

    • В-четвертых, я не установил ограничение в таблице в БД.

      Хорошая новость в том, что UUID для двоичных работает! Ура!!