簡體   English   中英

注釋快捷方式(Hibernate 的@Id、@GeneratedValue、@SequenceGenerator)

[英]Annotation shortcut (Hibernate's @Id, @GeneratedValue, @SequenceGenerator)

需要簡化代碼。 在我們公司,我們有如何為 DB 對象創建名稱的模式(參見下面的列表),這些模式適用於所有類/表,這會導致每個實體 class 中出現大量重復代碼(參見代碼示例)。 我能夠使用自定義命名策略簡化表名生成。 但是,使用命名策略,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;

這種方法將允許您輕松確定表和序列名稱。

如果您將 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;
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM