Spring Boot + JPA(hibernate 5) 開發時,數據庫表名大小寫問題

這幾天在用spring boot開發項目, 在開發的過程中遇到一個問題hibernate在執行sql時,總會提示表不存在。

尋找之後發現, 建表時,表統一採用了大寫。hibernate會把大寫統一轉換成小寫。且 mysql在 linux下 大小寫敏感。

解決:

1. 嘗試修改mysql的cnf文件,改成不區分大小寫。修改完成之後發現問題並沒有解決,還產生了新的問題,表名無論大小寫都失敗了。

2. 數據庫層面修改沒有效果, 表結構和表名不能修改,那隻能通過代碼實現來解決此問題了。

先感謝  三個博主提供的資料


地址一   http://blog.csdn.net/q979076061/article/details/51539960

地址二   http://blog.csdn.net/jackyxwr/article/details/8618908

地址三   http://blog.csdn.net/qinshijangshan/article/details/53444499


第一篇和第二篇  博客給我提供了很好的思路,然後就照着去實踐, hibernate 5之前 默認的命名定義策略使用的是 org.hibernate.cfg.ImprovedNamingStrategy 這個類。上面博客說的很清楚這裏就不贅述了。想要自定義命名策略 直接集成此類,在此類上擴展就好了。

代碼編寫完成之後, 配置之後,並沒有如願以償的解決了問題。思路很正確,只能順着接着找了。 看到第三篇博客之後發現自己哪裏有問題了, hibernate在5.1版本之後對此作了修改

引用第三篇博客原文:


原來是Hibernate5.1相關配置變了。

參考:http://412887952-qq-com.iteye.com/blog/2315686

參考:http://stackoverflow.com/questions/32165694/spring-hibernate-5-naming-strategy-configuration

hibernate.ejb.naming_strategy將不再被支持,而是被替換成了兩個屬性:
hibernate.physical_naming_strategy
hibernate.implicit_naming_strategy

對於physical_naming_strategy有兩個常用的配置:

org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy  
org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

對於PhysicalNamingStrategyStandardImplDefaultNamingStrategy的效果,對於SpringPhysicalNamingStrategyImprovedNamingStrategy的效果。


經過查看這兩個類的源碼之後, 發現上面的思路依舊是可以的下面是我的代碼

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.stereotype.Component;


@Component
public class MySQLUpperCaseStrategy extends PhysicalNamingStrategyStandardImpl {

	private static final long serialVersionUID = 1383021413247872469L;

	
	@Override
	public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
		// 將表名全部轉換成大寫
		String tableName = name.getText().toUpperCase();
		
		return name.toIdentifier(tableName);
	}

}


yml的配置:

   #配置hibernate的命名策略
    hibernate:
     naming:
        physical-strategy: com.XX.XX.common.MySQLUpperCaseStrategy


經過測試,終於解決此問題。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章