可以说我们有一个大型系统中的用户,但是每个用户在不同的子系统中可以有不同的风格。为了更容易理解,假设我们有以下类。
用户
作者:用户
编辑器:用户
这是我能想到的最简化的版本。请假定其中大多数具有更多字段,将存在更多来自User的继承类,并且同一用户可以一次分配给多个角色。在这种情况下
是否可以让Hibernate知道我要为Author和Redactor表中的实体共享User表中的行?
尤其是当我要更改用户名时,我希望在Author和Redactor中都看到它。目前,我发现的所有解决方案均以休眠状态在休眠状态下为每个Author,Redactor对在User表中创建重复记录。我还知道,通过不使用继承而是使用简单的一对一关系可以轻松解决ORM级别的问题。我不喜欢从代码方面使用这种方法,因为我可以简单地写author.firstName
的代码比author.user.firstName
更干净,而且正如我之前所说的那样,这是一个大大简化的示例,我需要包装LOTS Redactor类的自定义getter和setter中的属性以及继承User的其他属性以实现相似的可读性。
如果上面的描述足以解决问题,并且如果不能解决我可以改进的部分,我也将感谢您的反馈。还是由于内部机制无法在Hibernate中实现?如果是这样,您还有其他选择吗?
半与问题有关,但是在遇到类似问题时可能会帮助其他人,这是如何完成RedactorPublisher关系的访问,因为我必须从两个实体都可以访问它。最方便的方法是使用map,其中key是关系另一侧的实体。
@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