0

需要简化代码。在我们公司,我们有关于如何为 DB 对象创建名称的模式(参见下面的列表),这些模式适用于所有类/表,这会导致每个实体类中出现大量重复代码(参见代码示例)。我能够使用自定义命名策略简化表名生成。但是,使用命名策略,ID 列仅从其属性名称生成,但我还需要一个类/表名称作为它的一部分。同样适用于 valueGenerator。

是否有任何选项如何仅使用自定义命名策略来应用这些规则?我还可以想象使用自定义注释 eq @AcmeId 的解决方案,它从配置中获取项目前缀并“扩展自身”到这四个注释,如果可能的话(你能指出一些例子吗?)。

模式

  1. 项目中包含的表具有项目名称作为前缀,因此项目 ABC 中 MyClass 实体的表具有名称 ABC_MYCLASS)
  2. ID 列名由表名和_ID 组成,eq ABC_MYCLASS_ID
  3. 生成 ID 列值的序列,与 ID 列同名,后跟 _SEQ 后缀,eq ABC_MYCLASS_ID_SEQ
  public class MyClass {

   static final String CLASS_NAME = "MYCLASS";
   static final String TABLE_NAME = PROJECT_PREFIX + CLASS_NAME;
   static final String COLUMN_ID_NAME = PROJECT_PREFIX + CLASS_NAME + AcmeNamingStrategy.ID_COLUMN_POSTFIX;
   static final String SEQUENCE_NAME = PROJECT_PREFIX + CLASS_NAME + AcmeNamingStrategy.SEQUENCE_POSTFIX;

   @Id
   @Column(name = COLUMN_ID_NAME)
   @SequenceGenerator(name = SEQUENCE_NAME, sequenceName = SEQUENCE_NAME)
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE_NAME)
   private Long id;
4

1 回答 1

0

这种方法将允许您轻松确定表和序列名称。

如果将 id 属性命名为 一致id,它也将解决 id 命名问题:

public class CustomNamingStrategy extends DefaultNamingStrategy {

    ...
@Override
    public Identifier toPhysicalColumnName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        String result = super.toPhysicalColumnName(identifier, jdbcEnv);
        return "id".equals(identifier.getText()) ? "ABC_" + result : result;
    }

}
于 2021-04-06T10:11:00.083 回答