休眠数据库迁移-合并重复的实体

时间:2019-07-10 20:26:20

标签: java hibernate

前提

我最近被分配使用Java + JPA + Hibernate应用程序。

此应用程序具有4个不同的“模块”,每个模块都是彼此的“复制+粘贴”,只是做了些微改动。

我想删除所有重复项并使用一个数据库模式(当前,每个“模块”都有一个模式)。

我正在尝试以最少的“侵入性”方式开始,而不是对现有内容进行太多更改。

我所做的是:

  • 我创建了一个基本模块,并在其中移动了一些休眠实体。
  • 我使这些实体抽象化,并为每个模块创建了实现。
  • 我创建了一个新架构,并将其他所有模块记录都移到了它(我现在必须禁用数据库约束)。

示例:

@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);

由于我的用户对数据库中的每个模块都有一条记录(它应该仅返回1条),因此返回4条。

问题

使用“ @Query”,我可以以某种方式正确地按区分值过滤吗?

2 个答案:

答案 0 :(得分:0)

根据休眠Inheritance doc,您可以通过table per subclass而不是table per class hierarchy策略来实现。

答案 1 :(得分:0)

是的,您可以尝试使用where子句。有一个特殊的类属性,可用于将查询限制为子类型。以下是休眠参考文档。

hibernate reference doc.

根据您的情况,您可以使用subEntity名称而不是DomesticCat。

Click在这里查看where子句的休眠文档。