中文命名之Hibernate 4 + MySQL演示

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 用一个简单例子演示Hibernate + 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映射文件

客户.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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL 前端开发 数据可视化
MySQL Workbench 使用教程 - 如何使用 Workbench 操作 MySQL / MariaDB 数据库中文指南
MySQL Workbench 是一款专门为 MySQL 设计的可视化数据库管理软件,我们可以在自己的计算机上,使用图形化界面远程管理 MySQL 数据库。有关 MySQL 远程管理软件,你可以选择 Windows 下的 HeidiSQL,MacOS 下的 Sequel Ace 或者 MySQL 官方推出的跨平台客户端 MySQL Workbench 。
11545 0
|
SQL 缓存 自然语言处理
mysql中文全文检索从入门到放弃
like全匹配模糊查询不能使用索引一直是sql查询的一个棘手的问题,那么mysql的全文检索真的能解决这个问题吗?
1966 0
mysql中文全文检索从入门到放弃
|
关系型数据库 MySQL
Mysql中文汉字转拼音的实现
Mysql中文汉字转拼音的实现
522 0
|
关系型数据库 MySQL Java
Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionExcep linux下mysql修改连接超时wait_timeout修改后就ok了
Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionExcep linux下mysql修改连接超时wait_timeout修改后就ok了
181 1
|
关系型数据库 MySQL
【MySQL】永久解决mysql插入中文失败问题
问题描述: Incorrect string value:‘\xD5\xC5\xC8\xFD’ for column ‘name’ at row 1;
717 0
【MySQL】永久解决mysql插入中文失败问题
|
XML SQL Java
hibernate --MYSQL数据库 cfg.xml配置文件例子
hibernate --MYSQL数据库 cfg.xml配置文件例子
158 0
|
XML Java 关系型数据库
hibernate ---MySQL 数据库 配置的 hbm.xml 文件例子
hibernate ---MySQL 数据库 配置的 hbm.xml 文件例子
144 0
|
SQL 关系型数据库 MySQL
MySQL - Linux下MySQL中文乱码(中文问号)解决办法
MySQL - Linux下MySQL中文乱码(中文问号)解决办法
920 0
|
存储 关系型数据库 MySQL
【Mysql】char(25)和varchat(25)可以存多少文字,多少中文和英文的逗号
【Mysql】char(25)和varchat(25)可以存多少文字,多少中文和英文的逗号
242 0
|
Java 关系型数据库 MySQL
以mysql为例hibernate的配置文件
数据库连接配置文件
1324 0