在PersistenceException中执行JPQL查询的catch子句重新抛出PersistenceException

时间:2017-02-15 00:08:51

标签: jpa java-ee transactions persistence

我正在尝试使用JPA在我的JavaEE应用程序中的DAO中实现一些错误处理。

我遇到某人(用户)可能会尝试在我的数据库中输入重复项的情况。我的计划是试图坚持我的实体,例如。用户(“test@test.com”,“测试”,“密码”)。如果失败并出现PersistenceException,我想我可以检查唯一列上的重复条目,如username(“Test”)和email(“test@test.com)。如果我发现重复,我想查看哪个它失败的列并相应地通知用户。

我的尝试如下:

getEntityManager().persist(entity);
try {
    getEntityManager().flush();
} catch (PersistenceException ex) {
    List<T> duplicates = findDuplicate(entity);
    if (duplicates.size() > 0) {
        // Notify user
    } else {
        // Probably pass exception forwards
    }
}

实体经理将注入以下课程:

@PersistenceContext(unitName = "RecruitmentPU")
protected EntityManager mEM;

getEntityManager()只返回此成员。它自己的类被注释为@Stateless。

要找到副本我基本上就是这样做:

String column = myEntity.getUniqueColumn(); // returns the name of the column
Object uniqueValue = myEntity.getUniqueValue(); // returns the value of the unique column

Query query = getEntityManager().createQuery(
        "SELECT e FROM TestEntity e WHERE " + column + " = :identifier",
        TestEntity.class
);

query.setParameter("identifier", uniqueValue);
List<T> entries = null;
try {
    entries = (List<T>) query.getResultList(); // Here the exception is re-thrown
} catch(Exception ex) {
    System.out.println("Caught something... \n" + ex.getMessage());
}

该实体还有一个注释为@GeneratedValue(strategy = GenerationType.IDENTITY)的ID列。在简化代码时,还删除了@ManyToOne属性。当我测试这个时,我得到以下输出:

Info:   Caught something... 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.3.qualifier): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'Test' for key 'username_UNIQUE'
Error Code: 1062
Call: INSERT INTO test.test (email, username, role) VALUES (?, ?, ?)
        bind => [3 parameters bound]
Query: InsertObjectQuery(ID: 0 | email: test@test.com | username: Test | password: ********)

目前我正在让容器处理事务,但我正在预感到我遇到了这些问题,因为我试图在第一个事务完成之前查询数据库(或类似的东西)。

战略或实施中存在缺陷吗?我可以采取哪些步骤来解决这个问题?

1 个答案:

答案 0 :(得分:2)

don't want在发生异常后继续任何交易。

我建议您切换操作顺序,如下所示:

  1. 查询数据库,查找具有唯一键的记录,这些键等于您要保留的实体的唯一键,
  2. 坚持你的实体。