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

时间:2013-09-03 10:02:35

标签: 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等。)

我可以使用什么策略来规避这个问题,并且仍然可以在一个共同的超类中重新组合这些字段,并避免在我的所有实体中使用大量的冗余样板代码?

我的第一个想法是创建一个自定义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行丑陋的redondant代码(相当重要,因为实体之间唯一不同的是表格中的2个字母前缀,在这种情况下,名称" APR _"。)


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

1 个答案:

答案 0 :(得分:0)

您可以使用@AttributeOverrides在@Entity中指定带前缀的列名。但我认为没有办法只声明一次前缀。

看到这个问题: JPA Multiple Embedded fields