我在一个带有许多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;
}