作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个简单的实体,如下所示:
@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。我想到了两种方法,但我想知道是否有更有效的方法。
创建一个枚举并使用序数枚举来持久化。我宁愿避免这种情况,因为我只希望信息有一个“真实来源”,并且出于各种业务原因,它必须是一个查找表。
使用@Converter注释并编写自定义转换器。我认为这需要我查询表以提取相关行,因此这意味着每次转换内容时我都必须对数据库进行 JPA 调用。
我目前计划使用 2,但我想知道是否有任何方法可以在数据库本身内完成此操作,因为我认为使用 JPA 执行所有这些操作的成本比我在数据库。本质上是尝试保存一个字符串性别,然后数据库将查看查找表并将其转换为正确的 ID 并保存。
我专门使用 openJpa,但希望这不是特定于实现的。
最佳答案
既然您认真考虑过使用enum
,这意味着GENDER_LOOKUP
是静态的,即内容在程序运行时不会改变。
因此,您应该使用选项 2,但让转换器在第一次查找时缓存/加载 GENDER_LOOKUP
中的所有记录。这样,您仍然只有一个“事实来源”,而无需在每次查找时都访问数据库。
如果您需要添加新性别1,只需重新启动应用即可刷新缓存。
1) 如今,谁知道需要什么新性别。
关于java - 有没有办法在 JPA 中使用查找表作为转换器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61232655/
我是一名优秀的程序员,十分优秀!