Котлин: объявление недвижимости в спящем образце - PullRequest
0 голосов
/ 08 января 2019

У нас есть много java-приложений, и мы пытаемся реализовать наше первое в Kotlin. Вопрос в том, как лучше всего инициализировать свойства простой модели гибернации?

Давайте рассмотрим следующий пример на Java:

@Entity
@Table(name = "Session_Ids")
public class SessionId() {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long id;

    @Column
    protected Long number;
}

Теперь давайте предположим, что идентификатор и номер в базе данных никогда не могут быть нулевыми. Таким образом, после того, как hibernate завершен со всем, модель всегда будет иметь значение в поле id и значение в поле номера.

Как я могу это сделать в Котлине? Я не могу инициализировать их с нулем, потому что я должен объявить эти поля как Nullable, что не должно быть. Я не могу использовать lateinit, потому что оба поля являются примитивными типами long.

Единственный способ предотвратить определение их как обнуляемых - это инициализировать их неправильным значением по умолчанию. Что-то вроде

var number: Long = -1

Но это выглядит неправильно для меня.

Есть ли какая-нибудь лучшая практика, чтобы сделать что-то подобное в Котлине?

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 08 января 2019

У меня была та же проблема, что и у вас, и я избежал ее, определив, что переменная имеет значение nullable, затем добавила аннотацию @Column(nullable = false), чтобы вы знали, что ваша сущность всегда будет иметь идентификатор в базе данных. Вот пример того, что вы могли бы иметь:

class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false)
    val id: Long? = null
}

Я не знаю, является ли это лучшим решением, но я надеюсь, что оно помогло вам.

0 голосов
/ 08 января 2019

Другое решение, которое я нашел, - это классы данных kotlins, но я до сих пор не уверен, что это хороший способ.

Kotlin-версия Java-класса в моем вопросе будет выглядеть так:

@Entity
@Table(name = "Session_Ids")
data class SessionId(

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Long?,

    @Column
    var number: Long,
){
    constructor(userId: Long): this(null, userId)
}

Идентификатор все еще обнуляем, потому что в противном случае в спящем режиме могут возникнуть конфликты с существующими объектами с одинаковыми идентификаторами. Единственной другой опцией будет 0 в качестве значения, но я думаю, что для неперспективной сущности нуль более объясним, чем 0.

Я добавил вспомогательный конструктор, чтобы предотвратить передачу пустого значения для идентификатора.

Что вы думаете об этом?

0 голосов
/ 08 января 2019

Я использую 0, false, "" & c для необнуляемых полей (и null для обнуляемых) - в зависимости от того, какое значение имеет значение по умолчанию.

(Я не уверен, что это лучшая практика, но это лучший вариант, который я когда-либо видел!)

Значение будет перезаписано при загрузке существующих объектов, конечно, но оно может использоваться при создании новых, для полей, которые вы не устанавливаете вручную. Так что это может сообщить ваш выбор.

...