2017-09-05 68 views
0

我被困在Spring + Hibernate的奇怪问题上。Spring + Hibernate - 使用@Table名称注释问题

我有一些实体:

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 :)。

+0

以及如果忽略'catalog'?你也可以试试'MySQL5Dialog' – Antoniossss

+0

这两个变种都没有解决问题 –

+0

'spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl'没有帮助 –

回答

0

解决!

问题在于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

1)那么它是重复的2)如果你改变你的选择然后你什么都没改变,@Table可能仍然不起作用。 – Antoniossss