为什么在Hibernate中无法捕获ConstraintViolationException?

2eafrhcq  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(236)

我想这一定是一个很基本的问题。
我重新启动了这段代码,它试图在表中插入一个已经存在的行,但是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:异常。约束违反异常:无法执行语句

x0fgdtte

x0fgdtte1#

PersistenceException包裹
您实际上无法捕获ConstraintViolationException,因为JPA会将其 Package 为PersistenceException,但是您可以验证ConstraintViolationException是否导致了PersistenceException
https://stackoverflow.com/questions/54876448/how-to-catch-hibernate-constraintviolationexception-or-spring-dataintegrityviol

相关问题