我们对应用程序中的每个表都使用单表继承。这允许同一应用程序堆栈的不同实例与相同的 DAO 一起工作,而它们的实体可能略有不同,可能包含该实例独有的信息。如果实例需要,抽象类定义基本表结构,扩展定义附加列:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "client")
public abstract class Client extends AbstractPersistable<Long> {
// ...
}
应用 A:
@Entity
public class ClientSimple extends Client {
private String name;
// getter, setter
}
应用 B:
@Entity
public class ClientAdvanced extends Client {
private String description;
// getter, setter
}
现在,DAO 可以处理Client
应用程序 A 和 B 的对象,但应用程序 B 可以为其客户端对象定义附加信息,这些信息可由应用程序 B 独有的管理器方法读取:
应用 A:
Client client = new ClientSimple();
clientDao.save(client);
应用 B:
Client client = new ClientAdvanced();
clientDao.save(client);
不幸的是,这意味着每个表中都有一个 DTYPE 列(或我可能选择的任何其他名称)。有没有办法摆脱这个?我们不需要它,它正在占用数据库空间......
谢谢!
编辑
需要注意的重要一点:@MappedSuperclass
不起作用。我们使用QueryDSL作为我们的 HQL 抽象层。这需要为类型保存查询自动生成查询类型类。然而,这些只有在抽象类被注释时才能正确生成@Entity
。
这是必需的,因为我们想查询抽象类Client
,而实际上ClientSimple
在应用程序 A 和ClientAdvanced
应用程序 B 中查询:
因此,在任何应用程序中,这都会起作用:
query.where(QClient.client.name.equals("something");
在应用程序 B 中,这将起作用:
query.where(QClientSimple.client.description.equals("something else");
EDIT2 - 归结为
似乎可以归结为:我可以在部署时配置休眠以将继承实体的鉴别器类型设置为固定值。因此,以我的示例为例,aClient
将始终ClientSimple
在一个应用程序中,而在另一个应用程序ClientAdvanced
中,这样我就不必将该信息存储在数据库中?
就像我说的:每个应用程序都是基础应用程序堆栈的一个实例。每个应用程序可能会为其本地数据库定义额外的列,但所有对象都将属于该实例的相同类型,因此我们保证鉴别器始终相同,使其在数据库中成为冗余,并且是休眠配置的用例。