我想这一定是一个很基本的问题。
我重新启动了这段代码,它试图在表中插入一个已经存在的行,但是ConstraintViolationException被捕获到了一般的catch(Exception e)块中,而不是像我预期的那样被捕获到特定的catch(ConstraintViolationException e)块中。
我想知道我应该尝试什么来捕获该特定异常。
我的代码:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.exception.ConstraintViolationException;
import clases.Departamentos;
import util.HibernateUtil;
public class InsertarDepartamento {
public static void main(String[] args) {
//obtenemos la sesión actual
SessionFactory sf = HibernateUtil.getSessionFactory();
//creamos la sesión
Session s = sf.openSession();
Transaction tx = null;
try {
//creamos una transacción en la sesión
tx = s.beginTransaction();
System.out.println("Vamos insertar una nueva fila en la tabla Departamentos");
Departamentos dep = new Departamentos();
dep.setNumero(3);
dep.setNombre("Marketing");
try {
s.save(dep); //hacemos persistente el objeto departamento creado
} catch (ConstraintViolationException e) {
System.err.println(e);
}
tx.commit(); // javax.persistence.EntityTransaction;
} catch (Exception e) {
System.out.println(e.getMessage());
if (tx != null) {
tx.rollback();
}
} finally {
s.close();
}
}
}
我的控制台输出:
我们将在2022年11月18日上午1:10:26在部门表中插入一个新文件。SQL错误:1062,SQL状态:2022年11月18日上午1:10:26关键字“departamentos.PRIMARY”的重复条目“3”,2022年11月18日上午1:10:26,组织,Hibernate,引擎,jdbc,批处理,内部,抽象批处理实现发布信息:HHH000010:批处理发布时,它仍包含JDBC语句org. hib.异常。约束违规异常:无法执行语句
我正在根据评论中的一些建议编辑这个问题。我看到了两件事:
1.我假设是save方法启动了ConstraintViolationException,但实际上是commit方法启动了它
1.我可以捕获持久性异常(而不是约束违例异常)
我想知道这个代码是否可以接受:
import javax.persistence.PersistenceException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.exception.ConstraintViolationException;
import clases.Departamentos;
import util.HibernateUtil;
public class InsertarDepartamento {
public static void main(String[] args) {
//obtenemos la sesión actual
SessionFactory sf = HibernateUtil.getSessionFactory();
//creamos la sesión
Session s = sf.openSession();
Transaction tx = null;
try {
//creamos una transacción en la sesión
tx = s.beginTransaction();
System.out.println("Vamos insertar una nueva fila en la tabla Departamentos");
Departamentos dep = new Departamentos();
dep.setNumero(3);
dep.setNombre("Marketing");
try {
s.save(dep); //hacemos persistente el objeto departamento creado
tx.commit(); // javax.persistence.EntityTransaction;
} catch (ConstraintViolationException e) {
System.out.println("ConstraintViolationException: "+e.getMessage());
//e.printStackTrace();
} catch (PersistenceException e) {
System.out.println("PersistenceException: "+e.getMessage());
//e.printStackTrace();
}
} catch (Exception e) {
//System.out.println(e.getMessage());
//System.out.println(e.getCause());
//System.out.println(e.getStackTrace());
e.printStackTrace();
} finally {
if (tx != null) {
tx.rollback();
}
s.close();
}
}
}
这会产生以下新输出:
我们将在2022年11月18日上午9:54:59在部门表中插入一个新文件。SQL错误:1062,SQL状态:2022年11月18日上午9:54:59关键字“departamentos.PRIMARY”的重复条目“3”,2022年11月18日上午9:54:59。组织。休眠。引擎。jdbc。批处理。内部。抽象批处理实现发布信息:HHH000010:批处理释放时,它仍包含JDBC语句PersistenceException:异常。约束违反异常:无法执行语句
1条答案
按热度按时间x0fgdtte1#
被
PersistenceException
包裹您实际上无法捕获
ConstraintViolationException
,因为JPA会将其 Package 为PersistenceException
,但是您可以验证ConstraintViolationException
是否导致了PersistenceException
。https://stackoverflow.com/questions/54876448/how-to-catch-hibernate-constraintviolationexception-or-spring-dataintegrityviol