如何在 hibernate hbm.xml 中定义 char(2) 列?

lrk*_*kwz 3 java hibernate

您好,必须修改一些 Hibernate 遗留代码,我应该定义一个 SQL char(2) 列(char(2) 主键的外键)。

我的定义文件包含:

    <property
        name="language"
        type="char"
        update="true"
        insert="true"
        column="LANGUAGE"
        length="2"
    />
Run Code Online (Sandbox Code Playgroud)

但休眠生成:

+---------------------+--------------+------+-----+---------+----------------+
| Field               | Type         | Null | Key | Default | Extra          |
+---------------------+--------------+------+-----+---------+----------------+
(...)
| LANGUAGE            | char(1)      | YES  |     | NULL    |                |    
+---------------------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

外键表类似于:

+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| LANGUAGE     | char(2)      | NO   | PRI | NULL    |       |
(...)
+--------------+--------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

使用:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.3.1.GA</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

Jas*_*n C 6

Hibernate 中的类型char不映射到 a String,它映射到Java 中的achar或(参见6.1.1.2)。它恰好用作表中的基础列类型来支持 DBMS;巧合的是,它看起来像是简单地忽略了长度(但其原因实际上是不相关的)。Characterchar(1)

您必须使用stringfor 类型(因此它映射到 Java String),然后您必须告诉它用于char(2)存储。一种选择是显式指定sql-type,例如:

<property name="language" type="string" update="true" insert="true">
    <column name="LANGUAGE" sql-type="char(2)"/>
</property>
Run Code Online (Sandbox Code Playgroud)

或者稍后手动调整表格,将其从 更改varchar(2)char(2)