4

我在一个包含许多 maven 模块的大型模块化项目上工作,并且依赖关系管理非常复杂。

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


但是我的一个模块 XXX 需要使用一组实体 UserRule 来增强用户。

我想知道的是,是否可以对核心 BackOfficeUser 进行子类化以在我的应用程序中创建一个 XXXBackOfficeUser,该关系具有非实体拥有的新关系,它不需要 BackOfficeUser 的核心 db 表中的新列。

我知道我可以创建一个 DAO 并调用rulesDAO.findByUser(BackOfficeUser user) 但我想知道是否可以改为XXXBackOfficeUser.getRules()

所有这一切都没有修改许多其他模块使用的核心 BackOfficeUser 类,它不是 MappedSuperClass 或其他任何东西,而是一个常规的休眠实体。

4

1 回答 1

1

不修改 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;
}
于 2012-08-28T18:54:00.220 回答