Допустим, у нас есть пользователи в одной большой системе, но у каждого пользователя могут быть разные варианты в разных подсистемах. Чтобы было легче понять, предположим, что у нас есть классы, как показано ниже.
Пользователь
- Войти
- пароль
- 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