org.hibernate.HibernateException: Wrong column type


この問題は、データベース内のIDがchar(16)であるように、一定長の文字列をプライマリ・キーとして使用する場合に一般的に発生する.多くの資料ではお勧めしないと言われていますが、実際に私たちは小さなcaseをたくさんしている間に、自分でも便利のためにそんなに気にせず、好きなように設計しています.実はINTのメインキーを使って、あなたの元のID(char(16))にUnique Checkを追加したり、MySQLにUniqueインデックスを追加したりするのにどれだけの費用がかかりますか.
char()をプライマリキーとして使用すると、問題のようなエラーが発生する可能性があります.その原因はhibernateです.cfg.xmlファイルのHibernateをデータ定義言語(DDL)にマッピングする構成について
<property name="hbm2ddl.auto">validate</property>
hbm 2 ddlがvalidateに設定されている場合、hibernateがロードされるたびに、データベースのテーブル構造が作成されることを確認します.データベースのテーブルと比較するだけで、新しいテーブルは作成されませんが、新しい値が挿入されます.validateの具体的な内部実装はよくわかりませんが、検証のたびに問題のような問題が発生したからだと思います.データベースのフィールドタイプはchar()で、オブジェクトのプロパティはjavaです.lang.String、エラーの列タイプが発生しました.
このようなエラーは頻繁に発生するわけではありません.なぜならhibernateを構成しているからです.cfg.xmlファイルの場合、hbm 2 ddlはデフォルト値「update」を使用して構成されません.また、開発や学習の過程で「create」として構成されることが多く、このようなエラーに遭遇するのは難しいです.ここまでの解決策は明確です.hbm 2 ddlの構成を変更します.
次に、char()をプライマリ・キーとして使用する構成例を示します(ソース:Dashboard(Hibernate入門):
MySQLにHibernateTestリポジトリを追加し、USERテーブルを作成
CREATE TABLE USER (
    user_id CHAR(32) NOT NULL PRIMARY KEY,
    name VARCHAR(16) NOT NULL,
    sex CHAR(1),
    age INT
);
       
JavaクラスUser.java
package onlyfun.caterpillar;

public class User {
    private String id;
    private String name;
    private char sex;
    private int age;

    public int getAge() {
        return age;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public char getSex() {
        return sex;
    }

    public void setAge(int i) {
        age = i;
    }

    public void setId(String string) {
        id = string;
    }

    public void setName(String string) {
        name = string;
    }

    public void setSex(char c) {
        sex = c;
    }
}

       User.hbm.xmlファイル構成
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
    PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>

    <class name="onlyfun.caterpillar.User" table="USER">

        <id name="id" type="string" unsaved-value="null">
            <column name="user_id" sql-type="char(32)" />
            <generator class="uuid.hex"/>
        </id>

        <property name="name" type="string" not-null="true">
            <column name="name" length="16" not-null="true"/>
        </property>

        <property name="sex" type="char"/>

        <property name="age" type="int"/>

    </class>

</hibernate-mapping>

       hibernate.cfg.xmlファイル構成
<hibernate-configuration>

    <session-factory>

        <property name="show_sql">true</property>
        
        <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <property name="connection.url">jdbc:mysql://localhost/HibernateTest</property>
        <property name="connection.username">caterpillar</property>
    
        <property name="connection.password">123456</property>

        <mapping resource="User.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

上記は単純な構成例にすぎず、主にUserのchar(32)タイプのIDがどのように構成されているかを示す.
Hibernateに触れたばかりで、簡単な問題で頭がくらくらして、自分の学習ノートとして、指導を歓迎します.