【发布时间】:2013-09-06 12:27:40
【问题描述】:
我有一个现有的模式,其中每个表都有一个 3 个字母的前缀,然后在每一列上使用。例如:
表:USER
前缀:USR
字段:USR_ID, USR_STATUS, USR_LAN_ID 等
DB 家伙喜欢它,他还在 FK 字段中使用表前缀(例如 USR_LAN_ID 其中LAN 是 LANGUAGE 表的前缀。说它使 SQL(和 PL/SQL)更具可读性。并且我对此政策没有任何影响。
我可以通过使用 @Column 注释显式映射列来在 JPA 中使用它。无论如何,我大部分时间都需要它来获取额外的元数据(长度、可空性等)。
但是每个表都有大约 5 或 6 列共有,我想在 @MappedSuperclass 中重新组合。这些字段是:ID、STATUS 和审核字段(创建、更新用户和日期)。
但这不起作用,因为尽管这些字段在语义上相同,但它们的命名不同(一次是 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 行丑陋的冗余代码(相当冗余,因为实体之间唯一会有所不同的是表名称中的 2 个字母前缀,在本例中为“APR_ "。)
一个可能可行的想法:添加一个自定义@TablePrefix 注释,并实现一个注释处理器以在编译时生成上述内容,具体取决于基类......也许是一个小钉子的大锤子,但如果实体数量很多,值得...
【问题讨论】:
标签: java database hibernate jpa mapping