2017-09-05 70 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