在我的 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_1,table_2:
正如您在实体中看到的那样,出于业务逻辑的原因,我对 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
有什么想法吗?
您似乎是在说,由于业务逻辑的原因,一个表中的键和引用它的另一表中的外键的类型/格式存在差异。
数据库中的键应该是不透明的 - 即不受业务逻辑的影响。
我的建议是使键不透明并自动填充,最好是具有自动增量的 int,并确保键和外键的类型和值完全匹配。
如果需要,您仍然可以将“业务”数据保留在其他列中,只需将其保留在主键之外即可。
这有两个原因:
这就是“它应该如何工作” - 连接将更加高效,无需任何类型的转换,并且 hibernate 将“正常工作”
简单性 - 出错的机会更少,需要维护的机会也更少,而且您可以花时间编写业务逻辑,而不是浪费时间尝试让工具执行其设计之外的功能。