前提:
我最近被分配使用 Java + JPA + Hibernate 应用程序。
这个应用程序有 4 个不同的“模块”,每个模块都是彼此的“复制+粘贴”,只有细微的变化。
我想删除所有重复项并使用单个数据库架构(目前,每个“模块”都有一个架构)。
我试图以“侵入性最小”的方式开始,而不是对已有的内容进行太多改变。
我所做的是:
- 我创建了一个基本模块并将一些 hibernate 实体移至其中。
- 我对这些实体进行了抽象,并为每个模块创建了实现。
- 我创建了一个新架构,并将所有其他模块记录移至其中(我现在必须禁用数据库约束)。
示例:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "SYSTEM", length = 10, discriminatorType = DiscriminatorType.STRING)
@Table(name = "GROUP")
public abstract class Group<U extends UserGroup> {
@Id
private Integer id;
@Column(name = "CODE")
private String code;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "group")
private List<U> users;
@Entity
@Table(name = "USER_GROUP")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "SYSTEM", length = 10, discriminatorType = DiscriminatorType.STRING)
public abstract class UserGroup<G extends Group> {
@Id
private Integer id;
@Column(name = "name")
private String name;
@ManyToOne(optional=false)
@JoinColumn(name = "GROUP_ID", referencedColumnName = "ID", insertable=false, updatable=false)
private G group;
实现仅定义一个鉴别器列。
问题:
以下查询:
public interface UserGroupRepository<T extends UserGroup> extends CrudRepository<T, Integer> {
@Query(value = "select grp.code from #{#entityName} ug join ug.group grp where ug.name= ?1")
Iterable<String> listGroupByUser(String name);
返回 4 个项目,因为我的用户在数据库中拥有每个模块的记录(它应该仅返回 1 个项目)。
问题:
使用“@Query”,我可以以某种方式正确地按鉴别器值进行过滤吗?
最佳答案
根据 Hibernate Inheritance doc ,您可以通过每个子类一个表
而不是每个类层次结构一个表
策略来获得它。
关于java - Hibernate 数据库迁移 - 合并重复实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56978151/