您现在的位置是:首页 > 文章详情

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

日期:2019-06-03点击:369

2019_05_14_hibernateAnnotation

前文中文编程:中文命名之Hibernate 4+MySQL演示最后留下了个Hibernate 5之后出现的问题, 于是在Hibernate社区提交了报告: Seemingly regression since Hibernate 5: unicode support for class name in XML mapping file

开发组(Gail Badner)反应很快, 一同确认了当前稳定版5.4.2.Final和最新的6.0.0.Alpha2都有此问题, 并且基于官方测试用例重现了问题. 初步诊断病因是这个xsd约束(可以继续深究一下源头, 如果是从其他地方拷贝过来的话). 将此问题添加到了5.4版本的待修复问题列表, 并建议用注解(annotation)而不是xml配置. 经测试的确可通过注解支持与前文相同的中文命名.

完整源码在此分支: nobodxbodon/HibernateExampleZh

带注解的Java源码:

@Entity @Table(name="客户") public class 客户类 implements java.io.Serializable { private Long 客户_ID; private String 姓名; private Date 创建日期; public 客户类() { } public 客户类(String 姓名, Date 创建日期) { this.姓名 = 姓名; this.创建日期 = 创建日期; } @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name = "客户_ID", length=20) public Long get客户Id() { return this.客户_ID; } public void set客户Id(Long 客户Id) { this.客户_ID = 客户Id; } @Column(name = "姓名", nullable = false, length=45) public String get姓名() { return this.姓名; } public void set姓名(String 姓名) { this.姓名 = 姓名; } @Column(name = "创建日期", nullable = false, length=19) public Date get创建日期() { return this.创建日期; } public void set创建日期(Date 创建日期) { this.创建日期 = 创建日期; } @Override public String toString() { return 客户_ID + " " + 姓名 + " " + 创建日期; } }

在Hibernate配置文件中指定类, 而非xml映射文件:

 <mapping class="com.codeinchinese.客户.模型.客户类"></mapping>

期间碰到一个问题:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column '客户类0_.客户Id' in 'field list'

是由于id的默认数据库列名为Id, 而数据库中使用了客户_ID作为列名. 添加如下注解后解决:

 @Column(name = "客户_ID", length=20)

参考

Chapter 2. Mapping Entities

org.hibernate.MappingException: Unknown entity: annotations.Users

原文链接:https://yq.aliyun.com/articles/704524
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章