7

Hibernateで問題が発生しています。最近、hbm2ddlを検証するように設定しましたが、間違ったデータ型について多くの不満があります。ブール値を除くすべての問題を修正しました。

クラスにフィールドopenerがあり、次のようにマップされます。

<property column="opener" name="opener" type="boolean"/>

openerはatinyint (4)で、値は1または0です。これまでのところ、タイプを変更しようとしましたが、役に立ちませんでした。また、hibernate.cfgで次の設定を使用してみました。

<property name="hibernate.query.substitutions">true 1, false 0</property>

しかし、それでも同じエラーが発生します。私は何が間違っているのですか?

org.hibernate.HibernateException: Wrong column type: opener, expected: bit
    at org.hibernate.mapping.Table.validateColumns(Table.java:261)
    at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1083)
    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:116)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:317)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)

注:データベースにアクセスできません。

4

6 に答える 6

4

私と同じ問題に遭遇した人のために、ここに投稿された 2 つの回答を組み合わせて使用​​しました。

tinyint フィールドを処理するカスタム ユーザータイプを実装しました。

public class TinyIntegerToBoolean implements UserType {

    public int[] sqlTypes() {
        return new int[]{Types.TINYINT};
    }

    public Class returnedClass() {
        return Boolean.class;
    }

    public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor si, Object owner) throws HibernateException, SQLException {
        return (rs.getByte(names[0]) != 0);
    }

    public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor si) throws HibernateException, SQLException {
        st.setByte(index, Boolean.TRUE.equals(value) ? (byte) 1 : (byte) 0);
    }

    /* boilerplate... */
    public boolean isMutable() {
        return false;
    }

    public boolean equals(Object x, Object y) throws HibernateException {
        if (x == null || y == null) {
            return false;
        } else {
            return x.equals(y);
        }
    }

    public int hashCode(Object x) throws HibernateException {
        assert (x != null);
        return x.hashCode();
    }

    public Object deepCopy(Object value) throws HibernateException {
        return value;
    }

    public Object replace(Object original, Object target, Object owner)
            throws HibernateException {
        return original;
    }

    public Serializable disassemble(Object value) throws HibernateException {
        return (Serializable) value;
    }

    public Object assemble(Serializable cached, Object owner)
            throws HibernateException {
        return cached;
    }
}

次に、マッピングに次を追加しました。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <typedef class="com.test.model.TinyIntegerToBoolean" name="tinyint_boolean"/>
</hibernate-mapping>

次に、私が使用するオープナーフィールドでtype=tinyint_boolean、それは魅力のように機能します:)

于 2012-02-20T00:28:23.477 に答える
4

テーブルの SQL タイプを変更できない場合は、これを行うことをお勧めします。

<property name="opener" column="opener" type="path.to.your.package.YourClassUserType"/>

クラスを作成します:

import org.hibernate.usertype.UserType;

public class YourClassUserType implements UserType{
 ...
}

インターフェイス UserType からメソッドを実装する必要があります。実装はバイトをブール値に変換します (Java では TINYINT がバイト単位でマップされるため)

ここで例を見てください

幸運を :)

于 2011-06-01T15:55:29.627 に答える
3

DB列をとして定義char(1)し、Hibernateマッピングファイルでプロパティをとして定義できますtype="yes_no"。これはJavaブール型です。これらは、DBYに値として表示されます。N

使用するtiny_int場合、サイズは1である必要がありますが、これがHBMファイルでどのようにマップされるかは100%わかりません。

于 2011-05-31T14:12:39.240 に答える
1

これを試して :

<property column="opener" name="opener" access="field" />

あなたがゲッターを持っていると仮定して

 boolean isOpener() ;

とセッター

void setOpener(boolean b);
于 2011-05-31T14:13:38.850 に答える
1

numeric_booleanタイプとして使用することができます:

<property column="opener" name="opener" type="numeric_boolean"/>
于 2011-05-31T14:22:01.120 に答える
0

データベースにアクセスできないため、これは注意が必要です。しかし、それは少しの作業で行うことができます

カスタム型クラスを作成する必要があります。このクラスは、基本的にデータベースから値 (1 または 0) を取得し、真または偽のブール オブジェクトを返すロジックを含みます。

以下に例を示します。

http://alenovarini.wikidot.com/mapping-a-custom-type-in​​-hibernate

新しいタイプのマッピングは次のようになります。

    <typedef class="com.path.to.my.package.CustomBooleanType" name="myBoolType" />

そのクラスの nullSafeGet メソッドは、true または false を含む Boolean オブジェクトを返します。

したがって、新しいマッピングには次が含まれます。

<property column="opener" name="opener" type="myBoolType"/>
于 2011-06-03T03:13:29.920 に答える