我在一个带有许多Maven模块的大型模块化项目中工作,依赖管理非常复杂。

在我们的核心模块中,我们有一个具有许多属性的实体BackOfficeUser。
该实体在大多数应用模块中使用。

但是我的模块XXX之一需要通过实体UserRule的集合来增强用户。

我想知道的是,是否有可能在我的应用程序中将核心BackOfficeUser子类化以创建XXXBackOfficeUser,并且该实体不拥有新关系,因此不需要BackOfficeUser核心db表中的新列。

我知道我可以创建一个DAO并调用rulesDAO.findByUser(BackOfficeUser user)但我想知道是否有可能改为XXXBackOfficeUser.getRules()
所有这些都无需修改核心BackOfficeUser类,该类由许多其他模块使用,并且不是MappedSuperClass或其他任何东西,而是普通的休眠实体。

最佳答案

如果不修改BackOfficeUser类是不可能的,但是如果不修改保存BackOfficeUser的表就不可能。 对BackOffice类所需的修改是:

@Inheritance(strategy = InheritanceType.JOINED)

使用Hibernate,这不会导致将其他DTYPE列添加到根表中,因为Hibernate支持加入了不带鉴别符列的继承。 不带区分符的联接继承不可移植,因为规范不需要支持。结果是,为了定义BackOfficeUser的实际类型,查询将始终连接到新表。

实现大致如下:
//Existing BackOfficeUser, @Inheritance is added
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class BackOfficeUser {
    @Id private Integer id;
}


//New class that extends BackOfficeUser. Will have dedicated
//table for added persistent attributes, shared attributes
//are persisted to existing table "BackOfficeUser"
@Entity
public class XxxBackOfficeUser extends BackOfficeUser {
    private String someAttribute

    @ManyToMany (mappedBy = "xxxBackOfficeUsers")
    private List<Rule> rules;
}

//New entity class which does have relation to XxxBackOfficeUser
@Entity
public class Rule {
    @Id private Integer id;

    @ManyToMany
    private List<XxxBackOfficeUser> xxxBackOfficeUsers;
}

08-28 11:16