2011-03-09 46 views
6

如何强制hibernate生成数据库模式,以便将CamelCase转换为Underscores(使用HBM)?例如。我有:休眠时使用下划线生成列和表名称

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD//EN" 
     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="cz.csas.pdb.be.model.product.passive"> 

    <class name="foo.BarBaz"> 

     <id name="barBazId"> 
      <generator class="sequence"/> 
     </id> 

     <property name="extractContactType"/> 
     <!-- ... --> 
    </class> 
</hibernate-mapping> 

而且我想冬眠创建表像这样(甲骨文):

CREATE TABLE "BAR_BAZ" 
    (
    "BAR_BAZ_ID"    NUMBER(19,0) NOT NULL ENABLE, 
    "EXTRACT_CONTACT_TYPE"  VARCHAR2(512 CHAR), 
    -- PK etc... 
) 

我知道我可以在hbm.xml文件中使用的表/列名,但我想全局设置(既节省时间又防止错误)。

回答

7

ImprovedNamingStrategy应该做你想要的。请参阅3.6. Implementing a NamingStrategy

+0

它看起来像它应该工作正常,但我得到一个异常 产生的原因:org.hibernate.MappingException:通过不同的物理那些引用相同的逻辑列名:account_charge.PASSIVEACCOUNT =>“passive_account”和“passiveaccount”; 对于简单的多对一(accountCharge HBM具有“<多对一名称=”passiveAccount“/>”)。 – 2011-03-09 10:24:02

5

JPA 2(休眠4),it is even more easier,只需添加:

<property name="hibernate.ejb.naming_strategy" 
     value="org.hibernate.cfg.ImprovedNamingStrategy" /> 

persistence.xml

+0

听起来不错,但我得到一个SAX-Parse-Exception,它说明属性'value'必须被定义。可能我有一些旧的DTD或Schema for hibernate.cfg.xml。使用休眠4.3.5-Final。 – user152468 2014-07-06 18:56:04

+1

它完美的工作,允许我在数据库的实体和snake_case上使用camelCase(postgresql),我使用4.3.8-Final – edur 2015-03-01 02:44:10