我有一个现有架构,其中每个表都带有一个 3 个字母的前缀,然后在每一列上使用该前缀。例如:
表:USER
前缀:USR
字段:USR_ID、USR_STATUS、USR_LAN_ID
等
数据库人员喜欢它,他还在 FK 字段中使用表前缀(例如 USR_LAN_ID
,其中 LAN
是 LANGUAGE
表的前缀. 说它使 SQL(和 PL/SQL)更具可读性。我对此政策没有影响。
通过使用 @Column
注释显式映射列,我可以在 JPA 中使用它。无论如何,我大多数时候都需要它来获取额外的元数据(长度、可空性等)。
但是每个表都有大约 5 或 6 列是通用的,我想将它们重新组合到 @MappedSuperclass
中。这些字段是:ID
、STATUS
和审核字段(创建、更新用户和日期)。
但它不起作用,因为尽管这些字段在语义上相同,但它们的命名不同(一个是 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/