2017-05-23 4 views
-1

私はこれについてのスレッドはほとんどないことを知っていますが、私のコードではうまくいかない理由を理解できません。私は大文字、列、テーブル名、シーケンスを持つデータベース全体を持っています。しかし、私はsqlまたはcriteria経由でクエリを作成しようとすると、すべての値を小文字に変換します。私は回避策が見つかりましたがように私は、クエリを記述する必要はありません:私は私自身の命名戦略を実行stackoverflowの中にいくつかのスレッドを追跡しようとしたpostgresqlのためのHibernate 5命名戦略

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

} 

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

とマッピングどちらもうまくいきませんでした。

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メソッドをオーバーライドしてブレークポイントを設定しようとしました。ユニットテストをしようとすると、そこに止まらない。私がしたいことをする方法はありますか?または私はそれらを保持することを余儀なくされますか?私はあなたがデータベーステーブルAにあなたのエンティティAをマッピングするために、あなたのケースで注釈@Table(name = "A")を追加する必要が信じている

+0

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

+0

Postgresの識別子が –

+1

で始まる場合、それらのバッククォートは無効です "*大文字でデータベース全体を保持しています*" - どうしてそんなことをしました?最も良いことは、識別子に二重引用符を使用しないことです。それらを作成するときも(後でこれらの名前にアクセスする必要がある方法を定義していない) –

答えて

0

は、ここにある事前に

おかげで私の私はそれを使用する方法、それが役に立てば幸い:

@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

関連する問題