2013-11-09 4 views
1

В рамках моего приложения Java Я использую Коллекцию Перечисления следующим образом:Именования политики для @Enumerated @ElementCollection

@ElementCollection 
@Enumerated(EnumType.ORDINAL) 
protected Set<Tag> tags = new TreeSet<>(); 

Однако это определение дано в @MappedSuperClass и поэтому я не могу быть определяющим name в @JoinTable как имя будет сталкиваются внутри дочерних классов. Моя проблема в том, что политика именования по умолчанию для спящего режима игнорируется. Например, для унаследованного класса Event вместо таблицы с именем event_tags, hibernate пытается использовать Event_tags, а вместо поля event_id он пытается использовать Event_id. Мне кажется, что Hibernate полностью игнорирует политику именования и просто использует имена сущностей без каких-либо изменений.

Как я могу заставить его использовать политику именования по умолчанию?

+1

В качестве несвязанного примечания всегда используйте 'EnumSet', если ваш тип элемента является перечислением; он маленький и очень быстрый. – chrylis

+0

Ну, я не хочу использовать EnumSet, поскольку этот Enum имеет размер 1000, и у меня обычно есть только несколько элементов в наборе. Если вы проверите реализацию, вы увидите, что она выделяет память для всех элементов, что нежелательно в моем случае. –

ответ

0

Похоже, что политика именования по умолчанию не может справиться с этим, и вы обязаны реализовать свои собственные. Например:

public class NamingPolicy implements NamingStrategy, Serializable { 

    @Override 
    public String classToTableName(String className) { 
     return StringHelper.unqualify(className).toLowerCase(); 
    } 



    @Override 
    public String propertyToColumnName(String propertyName) { 
     return StringHelper.unqualify(propertyName); 
    } 



    public String singularize(String propertyName) { 
     if (propertyName != null && propertyName.endsWith("s")) { 
      propertyName = propertyName.substring(0, propertyName.length() - 1); 
     } 

     return propertyName; 
    } 



    @Override 
    public String tableName(String tableName) { 
     return tableName; 
    } 



    @Override 
    public String columnName(String columnName) { 
     return columnName; 
    } 



    @Override 
    public String collectionTableName(
      String ownerEntity, String ownerEntityTable, String associatedEntity, 
      String associatedEntityTable, String propertyName) { 

     return classToTableName(ownerEntityTable) + "_" + 
       or(associatedEntityTable, singularize(propertyName)); 
    } 



    @Override 
    public String joinKeyColumnName(String joinedColumn, String joinedTable) { 
     return columnName(joinedColumn); 
    } 



    @Override 
    public String foreignKeyColumnName(
      String propertyName, String propertyEntityName, 
      String propertyTableName, String referencedColumnName) { 

     String header = propertyName != null ? propertyName : propertyTableName; 
     if (header == null) { 
      throw new AssertionFailure("NamingStrategy not properly filled"); 
     } 

     return classToTableName(header) + "_" + referencedColumnName; 
    } 



    @Override 
    public String logicalColumnName(String columnName, String propertyName) { 
     return StringHelper.isNotEmpty(columnName) 
       ? columnName : StringHelper.unqualify(propertyName); 
    } 



    @Override 
    public String logicalCollectionTableName(
      String tableName, String ownerEntityTable, String associatedEntityTable, String propertyName) { 


     if (tableName != null) { 
      return tableName; 
     } else { 
      return tableName(ownerEntityTable) + "_" + (associatedEntityTable != null 
        ? associatedEntityTable 
        : singularize(propertyName)); 
     } 
    } 



    @Override 
    public String logicalCollectionColumnName(
      String columnName, String propertyName, String referencedColumn) { 
     return StringHelper.isNotEmpty(columnName) 
       ? columnName 
       : classToTableName(propertyName) + "_" + singularize(referencedColumn); 
    } 
} 
Смежные вопросы