Hibernate/JPA:加入不同类型的列

问题描述 投票:0回答:1

在我的 Spring Boot(3.2.3 版本)应用程序中,我有以下两个 JPA 实体:

@Entity
@Table(name = "table_1")
@Getter
@Setter
public class Table1 {

    @EmbeddedId
    private Table1ID id;

    @Column(name = "tt_xx")
    private String xx;

    @Column(name = "tt_yy")
    private String yy;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "ts_id", referencedColumnName = "tt_id")
    private List<Table2> t2List;

    @Data
    @Embeddable
    public static class Table1ID {

        @Convert(converter = PaddingConverter.class)
        @Column(name = "tt_id")
        private String ttID;

    }
}

@Entity
@Table(name = "table_2")
@Getter
@Setter
public class Table2 {

    @EmbeddedId
    private Table2ID id;

    @Column(name = "ts_xx")
    private String xx;

    @Column(name = "ts_yy")
    private String yy;

    @Data
    @Embeddable
    public static class Table2ID {

        @Column(name = "ts_id")
        private String tsID;

        @Column(name = "ts_key")
        private String tsKey;

    }
}

所以,在我的数据库中我有两个表:table_1table_2

  • table_1:将 tt_id 列作为主键,该列在数据库上的类型为 DECIMAL(8)。
  • table_2:具有列 ts_id (VARCHAR(8)) 和 ts_key 作为主键。

正如您在实体中看到的那样,出于业务逻辑的原因,我对 table_1 的 tt_id 应用了一个转换器,以便在应用程序中我们有一个 db 值 12345 的“00012345”类型的值。 然而,在 table_2 中,情况已经如此,因为数据库上的值恰好已经是一个包含前导零的字符串。

问题是我正在映射的 OneToMany 关系似乎不起作用。 Hibernate 似乎没有应用转换器。 我还尝试定义一个关系,例如:

@OneToMany(fetch = FetchType.EAGER)
@JoinFormula(referencedColumnName = "tt_id", value = "CAST(ts_id AS DECIMAL)")
private List<Table2> t2List;

但我收到错误“值涉及公式”。

Hibernate 版本:6.4.1 Final

有什么想法吗?

spring spring-boot hibernate jpa spring-data-jpa
1个回答
0
投票

您似乎是在说,由于业务逻辑的原因,一个表中的键和引用它的另一表中的外键的类型/格式存在差异。

数据库中的键应该是不透明的 - 即不受业务逻辑的影响。

我的建议是使键不透明并自动填充,最好是具有自动增量的 int,并确保键和外键的类型和值完全匹配。

如果需要,您仍然可以将“业务”数据保留在其他列中,只需将其保留在主键之外即可。

这有两个原因:

  1. 这就是“它应该如何工作” - 连接将更加高效,无需任何类型的转换,并且 hibernate 将“正常工作”

  2. 简单性 - 出错的机会更少,需要维护的机会也更少,而且您可以花时间编写业务逻辑,而不是浪费时间尝试让工具执行其设计之外的功能。

© www.soinside.com 2019 - 2024. All rights reserved.