Разделить строку в основной таблице сущностей в иерархии - PullRequest
0 голосов
/ 06 сентября 2018

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

Пользователь

  • Войти
  • пароль
  • 1012 * ПгвЬЫат *
  • фамилия

Автор : Пользователь

  • статьи // Список статей

Редактор : Пользователь

  • publisher // Список отношений RedactorPublisher, поскольку для каждого издателя редактор может иметь разные названия должности и другие свойства

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

Можно ли сообщить Hibernate, что я хочу поделиться строками в таблице User для сущностей в таблице Author и Redactor?

В частности, когда я меняю имя пользователя, я хотел бы видеть это как в Author, так и в Redactor. В настоящее время все решения, которые я нашел, закончились гибернацией, создавая дублированную запись в таблице User для каждой пары Author, Redactor. Я также знаю, что это на уровне ORM будет легко решено не использованием наследования, а простым отношением один к одному. Мне не нравится этот подход со стороны кода, потому что код, в котором я могу просто написать author.firstName, намного чище, чем author.user.firstName, и, как я уже говорил, это очень упрощенный пример, и мне нужно было бы обернуть множество свойств в пользовательские методы получения и установки в классе Redactor и другие, которые наследуют пользователя для достижения аналогичного уровня читаемости.

Буду также признателен за обратную связь, если приведенное выше описание достаточно ясно для решения проблемы, а если нет, то какие части я могу улучшить. Или, возможно, в Hibernate этого добиться невозможно из-за внутренних механизмов? Если да, у вас есть альтернативы?


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

@Entity
@PrimaryKeyJoinColumn(name = "id")
@Polymorphism(type = PolymorphismType.EXPLICIT)
class Redactor(
    // other fields ...
    @MapKeyJoinColumn(name = "publisher_id", referencedColumnName = "id")
    @OneToMany(mappedBy = "primaryKey.redactor", cascade = [(CascadeType.PERSIST)], orphanRemoval = false)
    var redactorPublisher: MutableMap<Publisher, RedactorPublisher> = mutableMapOf()
) : User

@Entity
data class Publisher(
    // other fields ...
    @MapKeyJoinColumn(name = "redactor_id", referencedColumnName = "id")
    @OneToMany(mappedBy = "primaryKey.publisher", cascade = arrayOf(CascadeType.PERSIST), orphanRemoval = false)
    var redactorPublisher: MutableMap<Redactor, RedactorPublisher> = mutableMapOf(),

@Entity
data class RedactorPublisher(
    @EmbeddedId
    var primaryKey: RedactorPublisherPrimaryKey,
    // other fields per RedactorPublisher pair
}

@Embeddable
data class RedactorPublisherPrimaryKey(
    @ManyToOne(fetch = FetchType.LAZY, cascade = [(CascadeType.ALL)])
    val publisher: Publisher,

    @ManyToOne(fetch = FetchType.LAZY, cascade = [(CascadeType.ALL)])
    val redactor: Redactor
) : Serializable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...