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

前文中文編程:中文命名之Hibernate 4+MySQL演示最後留下了個Hibernate 5以後出現的問題, 因而在Hibernate社區提交了報告: Seemingly regression since Hibernate 5: unicode support for class name in XML mapping filehtml

開發組(👍Gail Badner)反應很快, 一同確認了當前穩定版5.4.2.Final和最新的6.0.0.Alpha2都有此問題, 而且基於官方測試用例重現了問題. 初步診斷病因是這個xsd約束(能夠繼續深究一下源頭, 若是是從其餘地方拷貝過來的話). 將此問題添加到了5.4版本的待修復問題列表, 並建議用註解(annotation)而不是xml配置. 經測試的確可經過註解支持與前文相同的中文命名.java

完整源碼在此分支: nobodxbodon/HibernateExampleZhmysql

帶註解的Java源碼:git

@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映射文件:github

<mapping class="com.codeinchinese.客戶.模型.客戶類"></mapping>

期間碰到一個問題:sql

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 Entitiesapp

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

相關文章
相關標籤/搜索