2013-11-09 122 views
1

在我使用的枚舉的集合如下我的Java應用程序:命名策略@Enumerated @ElementCollection

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

但是這個定義@MappedSuperClass給出,所以我不能在@JoinTable被定義爲name的名字會在子類中碰撞。我的問題是,默認的休眠命名策略被忽略。例如,對於繼承類Event而不是名稱爲event_tags的表,休眠嘗試使用Event_tags而不是字段event_id它試圖使用Event_id。在我看來,Hibernate完全忽略了命名策略,只是使用實體名稱而沒有任何改變。

我該如何強制它使用默認的命名策略?

+1

作爲一個無關的註釋,如果元素類型是枚舉,則總是使用'EnumSet';它小而且速度非常快。 – chrylis

+0

嗯,我不想使用EnumSet,因爲這個Enum的大小是1000,我通常只有Set中的幾個元素。如果你檢查實現,你會看到它爲所有元素分配內存,這在我的情況下是不希望的。 –

回答

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); 
    } 
}