在JPA中是否可以使用查找表作为转换器?

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

想象一下,我有一个简单的实体,如下所示:

@Entity
@Table(name = "PERSON")
public class Person {

@Id
@Column(name = "NAME")
private String name;

@Column(name = "GENDER")
private String gender;
}

和两个表,包含信息的实际表和一个查找表。

TABLE PERSON (
NAME VARCHAR2 NOT NULL,
GENDER INT NOT NULL);

TABLE GENDER_LOOKUP (
GENDER_ID INT NOT NULL,
GENDER_NAME VARCHAR2 NOTNULL);

我想将我实体中的信息保存到表中,以便使用查找表作为参考,将String字段的性别自动转换为相应的int int。我想到了两种方法,但我想知道是否有更有效的方法。

  1. 创建一个枚举并使用序数枚举来持久化。我宁愿避免这种情况,因为我只想为信息提供一个“真相来源”,并且由于各种商业原因,它必须是一个查找表。

  2. 使用@Converter批注并编写一个自定义转换器。我认为这将要求我查询表以提取相关行,因此这意味着每次转换某些内容时,我都必须对数据库进行JPA调用。

我目前正在计划使用2,但是我想知道数据库本身是否可以使用它,因为我假设使用JPA来执行所有这些操作的成本要比我在数据库中进行的所有操作都要高。数据库。本质上是尝试保留String性别,然后数据库将查看查找表并将其转换为正确的ID并保存。

我专门使用openJpa,但希望这不是特定于实现的。

java database jpa openjpa
1个回答
0
投票

由于您已经认真考虑过使用enum,这意味着GENDER_LOOKUP是静态的,即程序运行时内容不会更改。

因此,您应该使用选项2,但要让转换器在第一次查找时从GENDER_LOOKUP中缓存/加载所有记录。这样,您仍然只有一个“事实来源”,而无需在每次查找时都命中数据库。

如果需要添加新的性别1,则只需重新启动应用程序即可刷新缓存。

1)这些天,谁知道需要什么样的新性别。

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