2017-05-23 108 views
-1

我知道有關於此的幾個線程,但我不明白爲什麼它不處理我的代碼。我擁有大寫字母,列,表名,序列的整個數據庫。但是當我嘗試通過sqlcriteria進行查詢時,它會將所有值轉換爲小寫。我發現了一個解決方法,但我不想寫這樣的查詢:Hibernate 5命名策略postgresql

select a."COLUMN_1", a."COLUMN_2" from schema."A" a 

和映射,如:

@Entity(name = "`A`") 
public class A implements Serializable { 
    @Column(name = "`COLUMN_1`") 
    private Integer column1; 
    @Column(name = "`COLUMN_2`") 
    private Integer column2; 

} 

我試圖按照計算器一些線程實現我自己的命名策略,但它都不起作用。

public class ModifiedImprovedNamingStrategy extends PhysicalNamingStrategyStandardImpl{ 

    @Override 
    public final Identifier toPhysicalColumnName(final Identifier name, final JdbcEnvironment context) { 
     return new Identifier(addUnderscores(name.getText()), name.isQuoted()); 
    } 

    /** 
    * Adds the underscores. 
    * 
    * @param name 
    *   the name 
    * @return the string 
    */ 
    protected static String addUnderscores(final String name) { 
     final StringBuilder buf = new StringBuilder(name.replace('.', '_')); 
     for (int i = 1; i < (buf.length() - 1); i++) { 
      if (Character.isLowerCase(buf.charAt(i - 1)) 
        && Character.isUpperCase(buf.charAt(i)) 
        && Character.isLowerCase(buf.charAt(i + 1))) { 
       buf.insert(i++, '_'); 
      } 
     } 
     return "`" + buf.toString().toUpperCase(Locale.ROOT) + "`"; 
    } 
    } 

,然後調用它在我的applicationContext這樣的:

<bean id="sessionFactory" 
     class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" 
     p:dataSource-ref="dataSource"> 
     <property name="packagesToScan" value="com.services.vo"/> 
     <property name="mappingLocations"> 
      <list> 
       <value>classpath*:hibernate/queries/**.hbm.xml</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.transaction.coordinator_class">org.hibernate.transaction.JDBCTransactionFactory</prop> 
       <prop key="hibernate.physical_naming_strategy">com.services.util.hibernate.ModifiedImprovedNamingStrategy</prop> 
       <prop key="hibernate.format_sql">true</prop> 
      </props> 
     </property> 
    </bean> 

我的目的是爲了避免到處寫的。我試圖在覆蓋ModifiedImprovedNamingStrategy方法中設置一個斷點。當我嘗試一個單元測試時,它並沒有停在那裏。有沒有辦法做到我想要的?還是我會被迫保留這些?

在此先感謝

+0

相關:https://stackoverflow.com/questions/32437202/improvednamingstrategy-no-longer-working-in-hibernate-5 –

+0

這些反引號對於Postgres標識符無效,以 –

+1

開頭「*我的整個數據庫都是大寫字母*」 - 你爲什麼這麼做?最好的辦法是不要使用雙引號標識符。在創建它們時(它定義了你以後需要如何訪問這些名稱)。 –

回答

0

我相信你有你的情況添加註釋@Table(name = "A")到你的實體A映射到數據庫表A,這裏是我的我如何使用它,希望它有助於:

@Entity 
@Table(name = "house") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
@Document(indexName = "house") 
public class House implements Serializable { 
    @NotNull 
    @Column(name = "location", nullable = false) 
    private String location; 

    @Size(max = 200) 
    @Column(name = "description", length = 200) 
    private String description; 
} 
+0

這是行不通的,當一個查詢被啓動時,它出現一個錯誤,說「一個表不存在」 – txomin