1

我正在使用带有对象“Cliente”的Hibernate(hibernate3.jar),如下所示:

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

“名词”属性映射为:

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

正如你在上面看到的,有一个字符长度限制 squals to 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会抛出此异常(作为调试器的详细信息,它位于以下行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" />

或删除长度属性。它将根据您的数据库供应商自动为 String 定义最大值

请参阅下面的链接

解决方案1

另请参阅下面的链接

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

用另一个 try-catch包围rollback()它,看看它是否是异常的原因

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

我无法从文档中确定回滚为什么会引发 DataException,但 javadoc 指出回滚可以引发 HibernateException,它是 DataException 的超类。

于 2013-04-13T02:07:48.273 回答