Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA中更好的异常处理_Java_Ejb 3.0_Jpa 2.0 - Fatal编程技术网

Java JPA中更好的异常处理

Java JPA中更好的异常处理,java,ejb-3.0,jpa-2.0,Java,Ejb 3.0,Jpa 2.0,我在持久化实体时使用了EJB3/JPA,我很高兴它能够管理与数据库相关的数据 任务 我唯一关心的是异常处理。保存实体时,我的示例代码总是采用这种风格。 我在网上读到的大多数教程都是这种风格的,也不涉及异常处理 @Stateless public class StudentFacade{ @PersistenceContext(unitName = "MyDBPU") private EntityManager em; public void save(Student s

我在持久化实体时使用了EJB3/JPA,我很高兴它能够管理与数据库相关的数据 任务 我唯一关心的是异常处理。保存实体时,我的示例代码总是采用这种风格。 我在网上读到的大多数教程都是这种风格的,也不涉及异常处理

@Stateless
public class StudentFacade{
    @PersistenceContext(unitName = "MyDBPU")
    private EntityManager em;

    public void save(Student student) {
        em.persist(student);
    }
}
但是我不知道在EJB应用程序中处理异常的最佳方式是什么? 处理异常时,最好的方法是什么

public void save(Student student) throws Exception {
    em.persist(student);
}
其他人就是这样处理异常的吗?会话外观上的try-catch块

@Stateless
public class StudentFacade{
    @PersistenceContext(unitName = "MyDBPU")
    private EntityManager em;

    public void save(Student student) {
        try {
            em.persist(student);
        } catch(Exception e) {
            //log it or do something
        }
    }
}
还是让该方法引发异常

public void save(Student student) throws Exception {
    em.persist(student);
}
我不知道我的理解是否正确,因为我还在学习EJB。
谢谢

如果希望方法抛出从em.persistence(…)获得的异常,那么不要用try/catch块包围该语句(因为它将捕获该块中的所有异常)

处理此问题的方式取决于应用程序,无论是否已经存在一些遗留代码。在有遗留代码的情况下,我建议您使用相同的方法(即使在某些情况下速度不是最优的)来保持一致性

否则,我建议遵循例外情况的“经验法则”——首先应该处理这些例外情况,在那里你拥有采取行动所需的有关它们的所有信息,否则就抛出它们,以便其他人能够处理。(如果你扔掉它们,一定要扔掉你能扔掉的最具体的异常形式(而不是一般的异常))。在使用JPA时处理异常与一般情况下处理Java异常没有什么不同


我希望这是关于异常的足够简单的信息,而不是开始一场“宗教对话”。

异常处理的思想是在发生任何故障的情况下,在单个点上执行一些逻辑。 try-catch将在需要处理异常或需要将异常转换为另一个异常的最后一点使用

假设你的应用程序有很多层,即动作层、外观层和持久层

代表例外情况 在这种情况下,在Facade上抛出的任何异常都可以抛出到上面的操作层。 在操作中,将捕获特定异常并使用正确的错误消息进行处理

//This is in Facade Layer
public void save(Student student) throws AppException{
    //exceptions delegated to action layer

    //call to Persist Layer
}
将常规异常转换为应用程序异常 比如说,在持久化中,您会得到和sqlException一样的DBException。这个异常不应该像这样发送到Action或Facade层,所以我们捕获特定的异常,然后抛出一个新的异常(应用程序的用户定义异常)

活动层 您将在操作中捕获异常,然后在那里处理异常

  //This is in Action layer
  public void callSave(Student student){
            try{
                //call Facade layer
            }catch(AppException e){
               //Log error and handle
            }
    }

如果您的组合是ejb和jpa,那么所有jpa异常都是运行时异常

ejb处理2种类型的异常1)应用程序异常2)系统异常

应用程序异常检查异常基本上我们使用的是业务验证和业务规则

系统异常是运行时异常,因此,如果发生任何运行时异常,ejb容器将干扰运行时异常并将其转换为远程异常

例如: 在dao层中

public void store(Cargo cargo) {
    entityManager.persist(cargo);
}
所有jpa异常仅为运行时异常

在ejb服务层中:

public TrackingId bookNewCargo(UnLocode originUnLocode,
        UnLocode destinationUnLocode,
        Date arrivalDeadline) {

    Cargo cargo = new Cargo(trackingId, routeSpecification);
    cargoRepository.store(cargo);
    return cargo.getTrackingId();
}
在ejb层,如果发生任何运行时异常,ejb容器将进行干预并转换为远程异常

在接口层中:

 public String register() {

    try {
         String   trackingId = bookingServiceFacade.bookNewCargo(
                    originUnlocode,
                    destinationUnlocode,
                    arrivalDeadline);


    } catch (Exception e) {
        throw new RuntimeException("Error parsing date", e); 
    }

因此,与此jpa-->ejb-->接口类似,如果您正在抛出异常,则不需要捕获它。如果持久层是ejb,则您的方法不起作用,因为在提交时,在方法返回后,会发生许多异常。