NamingStrategy

hibernateマッピングを行うときに、値を指定しないとデフォルト値が使われる。エンティティ名=テーブル名、プロパティ名=カラム名など。プロパティ名が長い場合、例えば、firstName というプロパティがあった場合、これはそのまま firstName というカラムにマッピングされる。Javaでは単語の連結のとき、次の単語の頭を大文字にしてつなげるのが一般的だが、データベースでは、_(アンダースコア)で繋げるのが一般的(だと思う)。

そういうときに、NamingStrategy を変更するとうまくこの差を吸収してくれる。デフォルトでは、DefaultNamingStrategy が使われるが、ImprovedNamingStrategy に変更すると、単語のつなぎをアンダースコアにしてくれる。他にも EJB3 specに準拠した EJB3NamingStrategy などもある。

使い方は Hibernate の Configuration に namingStratery をセットするだけ。

SessionFactory sf = new Configuration()
    .setNamingStrategy(ImprovedNamingStrategy.INSTANCE)
    .addFile("Item.hbm.xml")
    .addFile("Bid.hbm.xml")
    .buildSessionFactory();

Spring で使うには以下のように、SessionFactoryBean の namingStrategy にインジェクションすればよい。例では AnnotationSessionFactoryBean だが、LocalSessionFactoryBean でも同じ。

<bean id="sessionFactory"
 class= "org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="annotatedClasses"> 
    <list>
      <value>test.Parent</value>
      <value>test.Child</value>
    </list> 
  </property> 
  <property name="namingStrategy" ref="namingStrategy"/>
</bean>

<!-- NamingStrategy -->
<bean id="namingStrategy"
  class="org.hibernate.cfg.ImprovedNamingStrategy" />