Наследовать родительские свойства из базового класса с помощью аннотаций Jpa в Kotlin - PullRequest
0 голосов
/ 08 мая 2018

Все наши сущности JPA имеют @Id, @UpdateTimestamp, Оптимистическую блокировку и т. Д. Моя идея состоит в том, чтобы создать какой-то базовый класс ведьмы, содержащий все, что нужно каждой сущности JPA, которая может быть унаследована всеми ими.

open class JpaEntity (

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

   @UpdateTimestamp
   var lastUpdate : LocalDateTime? = null

   ...
)

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

Пока моя реализация не имеет "Идентификатора" согласно JPA

@Entity
class Car (

    @get:NotEmpty
    @Column(unique = true)
    val name : String

) : JpaEntity()

У кого-нибудь есть изящное решение для этого?

Ответы [ 2 ]

0 голосов
/ 20 июня 2018

Вы можете создать базовый класс для других объектов так же, как мы делаем это в Java (например, с @MappedSuperclass):

@MappedSuperclass
abstract class BaseEntity<T>(
        @Id private val id: T
) : Persistable<T> {

    @Version
    private val version: Long? = null

    @field:CreationTimestamp
    val createdAt: Instant? = null

    @field:UpdateTimestamp
    val updatedAt: Instant? = null

    override fun getId(): T {
        return id
    }

    override fun isNew(): Boolean {
        return version == null
    }

    override fun toString(): String {
        return "BaseEntity(id=$id, version=$version, createdAt=$createdAt, updatedAt=$updatedAt, isNew=$isNew)"
    }

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false
        other as BaseEntity<*>
        if (id != other.id) return false
        return true
    }

    override fun hashCode(): Int {
        return id?.hashCode() ?: 0
    }
}
@Entity
data class Model(
        val value: String
) : BaseEntity<UUID>(UUID.randomUUID()) { 

    override fun toString(): String {
        return "Model(value=$value, ${super.toString()})"
    }
}

См. Мой рабочий пример .

Примечание для @field аннотации - без него CreationTimestamp / UpdateTimestamp не работает .

0 голосов
/ 20 июня 2018

Вы должны аннотировать JpaEntity либо @Entity @Inheritance(strategy = ...), либо @MappedSuperclass. Второй вариант представляется более подходящим для вашего случая, но см. документацию (или https://en.wikibooks.org/wiki/Java_Persistence/Inheritance).

Ни Kotlin (за исключением, возможно, необходимости указывать цели аннотации, такие как get:), ни использование Spring Boot не должны иметь никакого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...