中文命名之Hibernate 4 + MySQL演示
最近有个契机, 需要在一个给定开发环境中验证中文命名的可行性. 达成的例子源码在: HibernateExampleZh
当前用的是Hibernate 3.3.2.GA. 之后测试了更多版本, 彩蛋见最后一部分.
测试环境:
- Windows 7 Pro 64bit, JDK 1.7.0_80, MySQL 5.5.62, Eclipse Kepler SR2
- MacOS 10.13.6, JDK 1.8.0_45, MySQL 5.5.24, Eclipse 4.7.3a
功能验证:
运行com.codeinchinese.App
, 在数据库表中插入一条记录并进行一次条件查询.
数据库
需修改hibernate.cfg.xml
中的数据库用户/密码部分.
DROP TABLE IF EXISTS `演示`.`客户`; CREATE TABLE `演示`.`客户` ( `客户_ID` bigint(20) unsigned COLLATE utf8_unicode_ci NOT NULL AUTO_INCREMENT, `姓名` varchar(45) COLLATE utf8_unicode_ci NOT NULL, `创建日期` datetime COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`客户_ID`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci; ALTER TABLE `演示`.`客户` ADD INDEX `姓名_索引` (`姓名` ASC) ;
Java
public class 客户类 implements java.io.Serializable { private Long 客户_ID; private String 姓名; private Date 创建日期; public 客户类() { } public 客户类(String 姓名, Date 创建日期) { this.姓名 = 姓名; this.创建日期 = 创建日期; } public Long get客户Id() { return this.客户_ID; } public void set客户Id(Long 客户Id) { this.客户_ID = 客户Id; } public String get姓名() { return this.姓名; } public void set姓名(String 姓名) { this.姓名 = 姓名; } public Date get创建日期() { return this.创建日期; } public void set创建日期(Date 创建日期) { this.创建日期 = 创建日期; } @Override public String toString() { return 客户_ID + " " + 姓名 + " " + 创建日期; } }
Hibernate映射文件
<hibernate-mapping> <class name="com.codeinchinese.客户.模型.客户类" table="客户"> <id name="客户Id" type="java.lang.Long"> <column name="客户_ID" /> <generator class="identity" /> </id> <property name="姓名" type="string"> <column name="姓名" length="45" not-null="true" /> </property> <property name="创建日期" type="timestamp"> <column name="创建日期" length="19" not-null="true" /> </property> </class> </hibernate-mapping>
检查更多Hibernate版本
经测试, 到4.2.21.Final
都正常运行, 但从5.0.0.Final
开始到最近的6.0.0.Alpha2
, 都不支持模型类名的中文命名. 具体报错如下:
Caused by: org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 58; cvc-pattern-valid: Value 'com.codeinchinese.客户.模型.客户类' is not facet-valid with respect to pattern '([a-zA-Z_$][a-zA-Z\d_$]*\.)*[a-zA-Z_$][a-zA-Z\d_$]*' for type 'ClassNameType'. at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203) at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:396) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:284) at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:452) at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3230) at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.processOneAttribute(XMLSchemaValidator.java:2825) at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.processAttributes(XMLSchemaValidator.java:2762) at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:2050) at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:740) at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.startElement(ValidatorHandlerImpl.java:570) at com.sun.xml.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:101) at com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:75) at com.sun.xml.bind.v2.runtime.unmarshaller.StAXEventConnector.handleStartElement(StAXEventConnector.java:261) at com.sun.xml.bind.v2.runtime.unmarshaller.StAXEventConnector.bridge(StAXEventConnector.java:130) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:460)
修改为英文类名com.codeinchinese.customer.model.Customer
后, 保留MySQL中文命名和Hibernate相关映射, 仍能运行.
考虑到这是从版本4到5的功能退化, 而且在6.0版本并无修复的意思, 应该提issue反馈一下.
参考

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Sublime Text编辑器配置Python解释器简易教程
前天在微信上遇到一个小伙伴问我一个关于Sublime text配置Python解释器的问题,可能是初学者,对这方面还不是很懂,想使用快捷键但是徒劳一场,因为缺少Python解释器,直接按下快捷键Ctrl+B是不会得到想要的结果的。 鉴于此,如果有小伙伴想使用Sublime跑Python程序的话,那么配置Python解释器是必不可少的一步,这里小编整理这篇手把手教程,希望为后来者铺砖引路。下面是详细教程: 1、首先打开Sublime,如下图所示,然后选择“Preferences”选项卡。 2、点击第一个选项“Browse Packages…”,然后系统会自动定位到Sublime的安装包目录。 3、尔后会弹出下图的文件夹界面。 4、在这堆文件夹中找到Python这个文件夹,如下图所示,然后进入该文件夹,找到Python.sublime-build这个文件。 5、在Sublime中打开该文件,如下图所示。 { "cmd":["python.exe","-u", "$file"], "path":"C:\Python34", "file_regex": "^[ ]File"(...?)", l...
- 下一篇
Python爬虫入门教程 42-100 爬取儿歌多多APP数据-手机APP爬虫部分
1. 儿歌多多APP简单分析 今天是手机APP数据爬取的第一篇案例博客,我找到了一个儿歌多多APP,没有加固,没有加壳,没有加密参数,对新手来说,比较友好,咱就拿它练练手,熟悉一下Fiddler和夜神模拟器是如何配合着使用的。 儿歌多多APP在豌豆荚的下载量还是可以的,一家做内容的APP。 2. APP安装和使用 APP直接去下载APK包就可以了,拖拽到夜神模拟器就安装成功了。在模拟器打开出现如下界面,表示已经可以开始操作了,非常儿童的APP。 3. 抓包测试 打开APP同时,打开Fiddler,首先测试一下网络是否正常,用模拟器自带的浏览器去访问百度,如果可以访问表示无问题,否则重新设置代理 运行软件过程中,注意观察Fiddler,如果出现JSON类型的API[接口],就要注意了,你想要的数据就在这里 我们点击链接,看Fiddler右侧显示内容
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7设置SWAP分区,小内存服务器的救世主
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群