我正在使用Hibernate(hibernate3.jar)和对象“Cliente”,如下所示:
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),但控制台中会显示异常,就像捕获不起作用一样。
答案 0 :(得分:1)
为列名nombre赋予较大的长度。例如
<column name="nombre" length="200" not-null="true" />
或删除长度属性。它将根据您的数据库供应商
自动为String定义最大值见下面的链接
另见下面的链接
https://stackoverflow.com/questions/1281188/text-field-using-hibernate-annotation
答案 1 :(得分: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的超类。