【问题标题】:Spring + Hibernate - issue with @Table name annotation [duplicate]Spring + Hibernate - @Table 名称注释问题[重复]
【发布时间】:2017-09-05 21:04:08
【问题描述】:

我遇到了 Spring + Hibernate 的奇怪问题。

我有一些实体:

package arthur.khusnutdinov.mysitev2.pub.mods.db;
// Generated 05.09.2017 23:23:19 by Hibernate Tools 5.2.5.Final

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * SitePages generated by hbm2java
 */
@Entity
@Table(name = "site_pages", catalog = "artfunpw")
public class SitePages implements java.io.Serializable {

    private Integer id;
    private String pageUrl;
    private String pageHtmlContent;

及会话配置代码:

@Bean
    public LocalSessionFactoryBean sessionFactory() {

        LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
        factoryBean.setDataSource(dbDataSource);

        Properties props = new Properties();
        props.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        props.setProperty("hibernate.format_sql", "true");
        props.setProperty("hibernate.show_sql", "true");

        props.setProperty("net.sf.ehcache.configurationResourceName", "/ehcache.xml");
        props.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.EhCacheProvider");
        props.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory");
        props.setProperty("hibernate.cache.use_second_level_cache", "true");
        props.setProperty("hibernate.cache.use_query_cache", "true");
        factoryBean.setHibernateProperties(props);
        factoryBean.setPackagesToScan("arthur.khusnutdinov");

        return factoryBean;
    }

一切正常,直到 MySQL 数据库中的表名是 sitepages,但如果表名是 site_pages,它就不起作用 - 我有 java.sql .SQLSyntaxErrorException:表'artfunpw.sitepages'不存在。 似乎 Hibernate 忽略了@Table(name = "site_pages", catalog = "artfunpw")

我做错了什么,如何让 Hibernate 尊重@Table 注释?

非常感谢!

更新 1: 尝试添加

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

进入 application.properties - 没有帮助。

hibernate.implicit_naming_strategy 也没有解决问题。

更新 2:我使用休眠 5 :)。

【问题讨论】:

  • 如果你忽略catalog 怎么办?你也可以试试MySQL5Dialog
  • 两种变体都没有解决问题
  • spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 没有帮助
  • <prop key="hibernate.implicit_naming_strategy">legacy-jpa</prop> 也无济于事

标签: mysql spring hibernate


【解决方案1】:

解决了!

问题在于 Hibernate 5 的变化。我在这里找到了一个非常有用的答案 - ImprovedNamingStrategy no longer working in Hibernate 5

找到答案后,我更改了sessionFactory() - 我添加了factoryBean.setPhysicalNamingStrategy(new PhysicalNamingStrategyStandardImpl()); - 代码:

@Bean
public LocalSessionFactoryBean sessionFactory() {

    LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
    factoryBean.setDataSource(dbDataSource);

    Properties props = new Properties();
    props.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
    props.setProperty("hibernate.format_sql", "true");
    props.setProperty("hibernate.show_sql", "true");

    props.setProperty("net.sf.ehcache.configurationResourceName", "/ehcache.xml");
    props.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.EhCacheProvider");
    props.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory");
    props.setProperty("hibernate.cache.use_second_level_cache", "true");
    props.setProperty("hibernate.cache.use_query_cache", "true");
    factoryBean.setHibernateProperties(props);

    factoryBean.setPhysicalNamingStrategy(new PhysicalNamingStrategyStandardImpl());

    return factoryBean;
}

我还更改了select 语句的代码。现在看起来像

List<SitePages> filmList = new ArrayList<>(); 

filmList = sessionFactory.getCurrentSession()
        .createNativeQuery("select * from site_pages")
        .setCacheable(false)
        .list();

System.out.println(filmList.size());

这些更改后一切正常:)。

【讨论】:

  • 1) 那么它是重复的 2) 如果你改变你的选择然后你什么都没有改变,@Table 可能仍然无法工作。
猜你喜欢
  • 2011-07-23
  • 2012-10-26
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 2010-09-23
  • 2020-02-29
  • 1970-01-01
相关资源
最近更新 更多