我有一个现有的模式,其中每个表都有一个 3 个字母前缀,然后在每列上使用。例如 :
表:USER
前缀:USR
字段:USR_ID, USR_STATUS, USR_LAN_ID
等
DB 家伙喜欢它,他还在 FK 字段中使用表前缀(例如,表的前缀USR_LAN_ID
在哪里。说它使 SQL(和 PL/SQL)更具可读性。我对这个策略没有影响。LAN
LANGUAGE
@Column
我可以通过使用注释显式映射列来在 JPA 中使用它。无论如何,我大部分时间都需要它来获取额外的元数据(长度、可空性等)。
但是每个表都有大约 5 或 6 列共有,我想在@MappedSuperclass
. 这些字段是 : ID
、STATUS
和审计字段(创建、更新用户和日期)。
但这不起作用,因为尽管这些字段在语义上是相同的,但它们的命名方式不同(一次是 will be USR_ID
,另一个 it will beGRP_ID
等等)
我可以使用什么策略来规避这个问题,并且仍然能够将这些字段重新组合到一个公共超类中,并避免在我的所有实体中使用大量冗余样板代码?
我的第一个想法是创建一个 custom 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 注释,并实现一个注释处理器以在编译时生成上述内容,具体取决于基类......也许是一个小钉子的大锤子,但如果实体的数量很高,这可能是值得的...