1

次のように、オブジェクト「Cliente」を使用してHibernate(hibernate3.jar)を使用しています。

public class Cliente {
    private nombre;
    ...
    //set and get
}

「nombre」属性は次のようにマッピングされます。

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

上記のように、文字の長さの制限は30です。ここで事態は複雑になります...エラーを強制するために、名前を長い名前で更新しようとしています:

Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();

try{
    cliente.setNombre(textField.getText()); //here
    session.update(cliente);
    tx.commit();
    list.repaint();
} catch (org.hibernate.exception.DataException e) {
    JOptionPane.showMessageDialog(null, "Data entered too long");
    session.getTransaction().rollback();
} finally {
    session.close();
}

名前が許可された制限を超えると、この例外org.hibernate.exception.DataExceptionがスローされます (debbuger の詳細として、次の行にありx.commit();ます:

SEVERE: Data truncation: Data too long for column 'nombre' at row 1
Hibernate: update gimnasiobd.cliente set nombre=? where idCliente=?
abr 12, 2013 7:40:07 PM org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.exception.DataException: Could not execute JDBC batch update

ここで何が問題なのですか?うーん...例外はキャッチされますが(JOPtionが表示されます)、キャッチが機能しないかのようにコンソールに例外が表示されます。

4

2 に答える 2

1

列名 nombre の長さを大きくしてください。例えば

<column name="nombre" length="200" not-null="true" />

または長さ属性を削除します。DBベンダーごとに文字列に自動的に定義された最大値を取ります

以下のリンクを参照してください

ソリューション1

以下のリンクも参照

https://stackoverflow.com/questions/1281188/text-field-using-hibernate-annotation
于 2013-04-13T01:59:11.827 に答える
0

rollback()を別の try-catch で囲み、それが例外の原因であるかどうかを確認します

catch (org.hibernate.exception.DataException e) {
    JOptionPane.showMessageDialog(null, "Data entered too long");
    try {
        session.getTransaction().rollback();
    } catch (HibernateException ex) {}
}

ロールバックが DataException をスローする理由をドキュメントから判断することはできませんでしたが、javadoc には、ロールバックが DataException のスーパークラスである HibernateException をスローできると記載されています。

于 2013-04-13T02:07:48.273 に答える