java - 在 Hibernate/JPA 映射中自动为列名添加特定于表的前缀?

标签 java database hibernate jpa mapping

我有一个现有架构,其中每个表都带有一个 3 个字母的前缀,然后在每一列上使用该前缀。例如:

表:USER 前缀:USR 字段:USR_ID、USR_STATUS、USR_LAN_ID

数据库人员喜欢它,他还在 FK 字段中使用表前缀(例如 USR_LAN_ID,其中 LANLANGUAGE 表的前缀. 说它使 SQL(和 PL/SQL)更具可读性。我对此政策没有影响。

通过使用 @Column 注释显式映射列,我可以在 JPA 中使用它。无论如何,我大多数时候都需要它来获取额外的元数据(长度、可空性等)。

但是每个表都有大约 5 或 6 列是通用的,我想将它们重新组合到 @MappedSuperclass 中。这些字段是:IDSTATUS 和审核字段(创建、更新用户和日期)。

但它不起作用,因为尽管这些字段在语义上相同,但它们的命名不同(一个是 USR_ID,另一个是 GRP_ID 等.)

我可以使用什么策略来规避这个问题,并且仍然能够将这些字段重新组合到一个公共(public)父类(super class)中,并避免在我的所有实体中使用大量重复的样板代码?

我的第一个想法是创建一个自定义的NamingStrategy,结合赢得一个自定义的@TablePrefix注解,但它似乎行不通,因为命名策略只是一种通用机制,在生成列名时不知道表名或实体类。

还有其他一些我可以扩展的 Hibernate 类吗?

有什么建议吗?

到目前为止,我一直在使用 JPA 2 和 Hibernate 作为我的提供程序。但这仍处于项目的早期阶段,我可能愿意接受涉及更换供应商的解决方案。


编辑:到目前为止我发现的“最不坏”的解决方案是覆盖每个实体上的列名。例如在 Role 实体上,在类之前添加:

@AssociationOverrides( {
        @AssociationOverride(name="creationUser", joinColumns=@JoinColumn(name="APR_USR_ID_CREATE")),
        @AssociationOverride(name="updateUser", joinColumns=@JoinColumn(name="APR_USR_ID_MODIFY"))
})
@AttributeOverrides({
        @AttributeOverride(name = "id", column = @Column(name = "APR_ID")),
        @AttributeOverride(name = "status", column = @Column(name = "APR_STATUS")),
        @AttributeOverride(name = "creationDate", column = @Column(name = "APR_USR_CREATE_DATE")),
        @AttributeOverride(name = "updateDate", column = @Column(name = "APR_USR_MODIFY_DATE"))
})

比重新定义类中的所有内容要好,但每个实体仍然有 10 行丑陋的重复代码(相当重复,因为实体之间唯一不同的是表名称中的 2 个字母前缀,在本例中为“APR_ ".)


一个可行的想法:添加一个自定义的@TablePrefix 注释,并实现一个注释处理器以在编译时生成上述内容,具体取决于基类……也许是大锤子换小钉子,但如果实体数量很多,这可能是值得的...

最佳答案

您可以使用@AttributeOverrides 来指定@Entity 中的前缀列名称。但我看不出只声明前缀一次的方法。

看到这个问题: JPA Multiple Embedded fields

关于java - 在 Hibernate/JPA 映射中自动为列名添加特定于表的前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18589422/

相关文章:

java - 在 hibernate 中使用 EXISTS 仅返回一行以提高性能(不使用 setMaxResult)

java - 如何引用 java 映射中类型的对象?

java - 解决 Java DateFormat 月份解析问题

java - 在java中读取XML数据库列

php - 将 HEX 数据上传到 MySQL 数据库

mysql - 选出运动项目最少的5个运动项目

java - jcmd - 命令 ManagementAgent.start 的用途是什么?

java - Android:状态栏的跳跃效果

java - 我是否必须防御性地保护 hql 查询中的空值?

hibernate - 按修订日期查询 Hibernate Envers 修订