在层次结构的核心实体表中共享行

时间:2018-09-06 00:51:05

标签: hibernate jpa hibernate-mapping

可以说我们有一个大型系统中的用户,但是每个用户在不同的子系统中可以有不同的风格。为了更容易理解,假设我们有以下类。

用户

  • 登录
  • 密码
  • 名字

作者:用户

  • articles //文章列表

编辑器:用户

  • publisher // RedactorPublisher关系列表,因为对于每个发布者,redactor可以具有不同的职务和其他属性

这是我能想到的最简化的版本。请假定其中大多数具有更多字段,将存在更多来自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

0 个答案:

没有答案