Java JPA中更好的异常处理
我在持久化实体时使用了EJB3/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
@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,则您的方法不起作用,因为在提交时,在方法返回后,会发生许多异常。