Hibernate 命名策略被忽略

Posted

技术标签:

【中文标题】Hibernate 命名策略被忽略【英文标题】:Hibernate Naming Strategy is ignored 【发布时间】:2015-07-08 03:59:08 【问题描述】:

我通过persistence.xml在我的应用程序中配置了休眠,如下所示:

<persistence-unit name="entityManager"  transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
        <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />
        <property name="hibernate.archive.autodetection" value="class" />   
        <property name="hibernate.hbm2ddl.auto" value="update" />       
    </properties>
</persistence-unit>

并通过创建 EnityManagerFactory 的 EntityManagerUtil 类:

            Config config=CommonSettings.getInstance().config;
        Map<String, Object> configOverrides = new HashMap<String, Object>();
        configOverrides.put("hibernate.ejb.naming_strategy","org.hibernate.cfg.ImprovedNamingStrategy");
        configOverrides.put("hibernate.dialect",config.hibernateConfig.dialect);
        configOverrides.put("hibernate.show_sql", config.hibernateConfig.showSql);
        configOverrides.put("hibernate.max_fetch_depth", config.hibernateConfig.maxFetchDepth);
        configOverrides.put("hibernate.jdbc.batch_size",config.hibernateConfig.batchSize);
        configOverrides.put("hibernate.connection.pool_size", config.hibernateConfig.poolSize);
        configOverrides.put("hibernate.connection.charSet", config.hibernateConfig.charSet);
        configOverrides.put("hibernate.connection.characterEncoding",config.hibernateConfig.characterEncoding);
        configOverrides.put("hibernate.connection.useUnicode", config.hibernateConfig.useUnicode);
        configOverrides.put("hibernate.connection.autocommit", config.hibernateConfig.autocommit);
        configOverrides.put("hibernate.connection.release_mode",config.hibernateConfig.releaseMode);
        configOverrides.put("hibernate.cache.use_second_level_cache", config.hibernateConfig.useSecondLevelCache);
        configOverrides.put("hibernate.cache.use_query_cache", config.hibernateConfig.useQueryCache);
        configOverrides.put("hibernate.cache.use_structured_entries", config.hibernateConfig.useStructuredEntries);
        configOverrides.put("hibernate.cache.region.factory_class",config.hibernateConfig.factoryClass);

        configOverrides.put("packagesToScan", "org.prosolo.common.domainmodel");

        configOverrides.put("javax.persistence.jdbc.driver",config.mysqlConfig.jdbcDriver);
        configOverrides.put("javax.persistence.jdbc.url", "jdbc:mysql://"
                + host + ":" + port + "/" + database);
        configOverrides.put("javax.persistence.jdbc.user", user);
        configOverrides.put("javax.persistence.jdbc.password", password);
        try

             emf = Persistence.createEntityManagerFactory("entityManager",
                configOverrides);

        catch(Exception ex)
            ex.printStackTrace();
        

我尝试在persistence.xml 和配置覆盖中将命名策略配置为ImprovedNamingStrategy。但是,它不起作用,hibernate 会生成带有 CamelCase 表名的新表。

知道我在这里做错了什么吗?

谢谢

【问题讨论】:

我认为提到的链接可能对您有所帮助。 "almaer.com/blog/hibernate-improvednamingstrategy 和 petrikainulainen.net/programming/tips-and-tricks/… 谢谢。我已经找到了这些链接和许多其他链接,但对我没有帮助。 好的.. 我认为@VladMihalcea 的回答应该对您有更多帮助.. 【参考方案1】:

您的映射看起来很好,所以我怀疑配置被引导过程中的某些东西覆盖了。

尝试在此代码块的EntityManagerFactoryBuilderImpl.processProperties() 方法中添加断点:

else if ( AvailableSettings.NAMING_STRATEGY.equals( keyString ) ) 
    namingStrategy = strategySelector.resolveStrategy( NamingStrategy.class, entry.getValue() );

else if ( AvailableSettings.NAMING_STRATEGY_DELEGATOR.equals( keyString ) ) 
    namingStrategyDelegator = strategySelector.resolveStrategy( NamingStrategyDelegator.class, entry.getValue() );

看看那里的配置是否可用。

【讨论】:

感谢弗拉德的建议。它让我找到了解决方案。我无法调试这个,因为我没有达到这个方法。我有调用 provider.createEntityManagerFactory 的 Persistence.createEntityManagerFactory。然而,当我试图调试这个时,我意识到我在包含休眠实体的 Maven 子模块中使用了 Hibernate 4.3,并在使用 EntityManager 的项目中构建了 EntityManager 和 Hibernate 5.0。一旦我在两个项目中切换到 4.3 版,一切都开始正常工作。谢谢。

以上是关于Hibernate 命名策略被忽略的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate HQL 查询:如何将集合设置为查询的命名参数?

Hibernate命名策略

Hibernater入门笔记

Hibernate 命名策略更改表名

hibernate 命名策略

Spring Boot 的 Hibernate 字段命名问题(命名策略)