4

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

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

DB 家伙喜欢它,他还在 FK 字段中使用表前缀(例如,表的前缀USR_LAN_ID在哪里。说它使 SQL(和 PL/SQL)更具可读性。我对这个策略没有影响。LANLANGUAGE

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

但是每个表都有大约 5 或 6 列共有,我想在@MappedSuperclass. 这些字段是 : IDSTATUS和审计字段(创建、更新用户和日期)。

但这不起作用,因为尽管这些字段在语义上是相同的,但它们的命名方式不同(一次是 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 注释,并实现一个注释处理器以在编译时生成上述内容,具体取决于基类......也许是一个小钉子的大锤子,但如果实体的数量很高,这可能是值得的...

4

1 回答 1

0

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

请参阅此问题: JPA 多个嵌入式字段

于 2013-09-03T10:56:41.630 回答