Kotlin с JPA / Hibernate: без ленивой загрузки без `open`?

Пример кода примера Kotlin JPA выглядит следующим образом:

class Person(val name: String, val age: Int) { /* ... */ } 

или даже

 data class Person(val name: String="", val age: Int=0) { /* ... */ } 

Теперь, руководство пользователя Hibernate , и я думаю, что также несколько других ORM, заявляют, что они обычно хотят создавать прокси или иным образом расширять класс модели, но чтобы разрешить в Kotlin класс явно быть open . В настоящее время это невозможно с классами данных, и я полагаю, исходя из собственного опыта, что большинство людей не думают об этом при написании сущностей JPA в Котлине.

Итак, чтобы ответить на мой вопрос (в конце концов, это stackoverflow), достаточно ли этого сделать

  open class Person(val name: String, val age: Int) { /* ... */ } 

или мы действительно должны были бы сделать

  open class Person(open val name: String, open val age: Int) { /* ... */ } 

чтобы не нарушать ORM при правильной работе?
Если это действительно вредно, мы должны, вероятно, предложить добавить предупреждение IntelliJ IDEA, что если класс имеет аннотацию @Entity , он должен быть определен open .

В приведенном ниже учебном пособии указаны:

Класс сущности должен иметь открытый или защищенный конструктор без аргументов … Интерфейс не может быть обозначен как сущность … Класс сущности не должен быть окончательным. Никакие методы или постоянные переменные экземпляра класса сущности не могут быть окончательными.

Классы Kotlin следуют за соглашением JavaBeans для сеттеров / геттеров.

Если у вашего ORM есть требования, как указано выше, вам действительно нужно указать open на классе и его методах:

 open class Person(open val name: String = "", open val age: Int = 0) 

Значения по умолчанию для всех параметров конструктора позволяют Kotlin генерировать дополнительный пустой конструктор. В качестве альтернативы вы можете предоставить его как вторичный конструктор:

 open class Person(open val name: String, open val age: Int) { constructor() : this("", 0) } 

Обратите внимание, что open val создает закрытое конечное поле и открытый геттер. Если этого недостаточно, используйте аннотации, такие как @JvmField open val name .

ORM, такие как используемые вами, имеют дополнительное трение с кодом Котлина из-за сомнительных шаблонов дизайна, которые они используют (например, сделать все не финальным).

Хорошим вариантом является использование ORM, специфичного для Kotlin. Например, Exposed поддерживается JetBrains и используется для некоторых своих продуктов, что говорит само за себя. Другим вариантом является Ebean, который официально поддерживает Kotlin (спасибо @johnp)

Intereting Posts
Как объединить список в списке типа, в один неизменный список? У Kotlin 1.2.10 и Java 9 есть противоположные правила относительно автоматических модулей? Объявление байта в Kotlin делает ошибку времени компиляции «Целочисленный литерал не соответствует ожидаемому типу Byte» @Embeddable класс с val в Котлине JEXL3 – Невозможно переопределить bitwiseXor в JexlArithemtic? Определение размера для настраиваемого типа массива в Android Kotlin Как конвертировать JS-код в Kotlin без ключевого слова 'new' Котлинский эквивалент тернарного оператора nullPointerException на вспомогательном классе sharedpreferences При запуске теста Тип несоответствия: выведенный тип – FragmentActivity? но при обновлении библиотеки поддержки до 27.0.0 RecyclerView – исключение NullPointerException для .findViewById Почему я могу использовать имя выражения лямбда, но не имя функции? свойство lateinit не инициализируется при восстановлении активности Каков идиоматический способ клонирования MutableMap? Это правильный способ бросить