最近有个契机, 需要在一个给定开发环境中验证中文命名的可行性. 达成的例子源码在: 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映射文件

客户.hbm.xml

<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反馈一下.

参考

Maven 3 + Hibernate 3.6 + Oracle 11g Example

中文命名之Hibernate+MySQL演示的更多相关文章

  1. 中文命名之Hibernate 5演示 - 使用注解(annotation)而非xml定义映射

    前文中文编程:中文命名之Hibernate 4+MySQL演示最后留下了个Hibernate 5之后出现的问题, 于是在Hibernate社区提交了报告: Seemingly regression s ...

  2. 2018-07-30 对DLL库中的接口进行中文命名

    补注: 此文是在探究在Windows上编写DLL时不能使用中文命名 · Issue #74 · program-in-chinese/overview问题时编写的演示用代码, 代码基于官方文档. 正如 ...

  3. 2017-10-29 用中文命名API的意义和途径

    "中文编程"知乎专栏原链 在前文对在代码中使用中文命名的质疑与回应中阐述了在代码中使用中文命名的益处. 此文将从软件使用者的角度阐述对API中文化的意义并探讨实现途径. 当然, 文 ...

  4. ruby -- 进阶学习(四)paperclip上传中文命名图片

         Paperclip -- 上传中文命名图片 使用Paperclip和ImageMagick插件来处理图片的时候,上传非中文命名的图片时,只要把配置写好就没问题 if you need to ...

  5. Ubuntu Android Studio/IntelliJ IDEA 支持文件中文命名

    Android Studio 默认字体无法使用中文命名文件,中文显示空心方块,使用思源字体,可解析 下载思源字体http://www.cnblogs.com/icgq/p/4195347.html 选 ...

  6. DL4NLP —— 序列标注:BiLSTM-CRF模型做基于字的中文命名实体识别

    三个月之前 NLP 课程结课,我们做的是命名实体识别的实验.在MSRA的简体中文NER语料(我是从这里下载的,非官方出品,可能不是SIGHAN 2006 Bakeoff-3评测所使用的原版语料)上训练 ...

  7. Spring MVC Hibernate MySQL Integration(集成) CRUD Example Tutorial【摘】

    Spring MVC Hibernate MySQL Integration(集成) CRUD Example Tutorial We learned how to integrate Spring ...

  8. LAMP环境下,通过网页url获取gb2312编码中文命名的下载资源方法

    最近有个功能, 要求获取中文命名的.zip压缩文件,我准备直接采用网页url填写压缩文件地址的方式获取下载资源, 但问题是 我们的linux系统和php编程环境都是采用的zh_GB2312编码, 而浏 ...

  9. 基于BERT预训练的中文命名实体识别TensorFlow实现

    BERT-BiLSMT-CRF-NERTensorflow solution of NER task Using BiLSTM-CRF model with Google BERT Fine-tuni ...

随机推荐

  1. k8s实践 - 如何优雅地给kong网关配置证书和插件。

    前言 从去年上半年微服务项目上线以来,一直使用kong作为微服务API网关,整个项目完全部署于k8s,一路走来,对于k8s,对于kong,经历了一个从无到有,从0到1的过程,也遇到过了一些坎坷,今天准 ...

  2. 第一章.java&golang的区别之:闭包

    对于golang一直存有觊觎之心,但一直苦于没有下定决心去学习研究,最近开始接触golang.就我个人来说,学习golang的原动力是因为想要站在java语言之外来审视java和其它语言的区别,再就是 ...

  3. Netty源码—二、server启动(2)

    我们在使用Netty的时候的初始化代码一般如下 EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGro ...

  4. Android版数据结构与算法(一):基础简介

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 一.前言 项目进入收尾阶段,忙忙碌碌将近一个多月吧,还好,不算太难,就是麻烦点. 数据结构与算法这个系列早就想写了,一是梳理总结,顺便逼迫自己把一 ...

  5. Axios发送AJAX请求

    目录 Axios 特征 axios提供主要三种发起请求的方式 方式一:直接axios实例直接call方式 方式二:通过axios实例提供的不同http请求方式的方法 方式三:其实是从第二种方式中单独提 ...

  6. jqGrid 常用 总结 -2

    这次的总结是针对于一次bug,先说下我们遇到的问题,就是后台人员告诉我们添加数据到100条数据的时候,101条就看不到,当时我觉得就是没有分页的原因,所以我就以为在jqgrid中设置一个loadonc ...

  7. SAP MM已经转成PO的采购申请Item依旧可以被删除?

    SAP MM已经转成PO的采购申请Item依旧可以被删除? 笔者测试发现,我们可以删除已产生PO的PR item, 系统只是给一个警告信息,不阻止保存. Purchase orders already ...

  8. 使用 FFT 进行频谱分析

    下面的示例说明了如何使用 FFT 函数进行频谱分析.FFT 的一个常用场景是确定一个时域噪声信号的频率分量. 首先创建一些数据.假设是以 1000 Hz 的频率对数据进行的采样.首先为数据构造一条时间 ...

  9. 巧妙地使用typora编辑有道云笔记

    设置方法 找到有道云笔记本地保存路径: 找到有道云笔记的保存的路径:启动有道云 - 设置 - 有道云笔记(本地文件) - 打开文件夹 使用typora打开有道云笔记目录: typora 菜单栏 - O ...

  10. Centos7.3离线(rpm方式)安装mysql服务

    1.mysql官网下载安装包,官网地址:www.mysql.com [root@seiang software]# ll total 580020 -rw-r--r--. 1 root root 59 ...