java - Hibernate 数据库迁移 - 合并重复实体

标签 java hibernate

前提:

我最近被分配使用 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/

相关文章:

mysql - Spring Security + Hibernate 身份验证

java - Oracle JPA GenerationType.AUTO 与生成器要求 "hibernate_sequence"

java - 回滚时的 Spring 事务不会将数据库恢复到以前的状态

java - 如何在 postgres - Hibernate 中设置锁定超时

java - 奇怪的java.io.NotSerializedException : org. springframework.dao.support.PersistenceExceptionTranslationInterceptor

java - 复数类多项式乘法

java - 通过 Hibernate 访问连接中的 SSL 参数

java - Processing IDE 启动 - 未启动任何Processing 2.0 版本(测试版和稳定版)

java - 如何使用 SimpleFlatMapper 将带前缀的 CSV 列别名到映射?

java - 如何远程调用 RESTful web 服务