gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:13:21 25 4
gpt4 key购买 nike

前提:

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com