我正在尝试使用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: ********)
目前我正在让容器处理事务,但我正在预感到我遇到了这些问题,因为我试图在第一个事务完成之前查询数据库(或类似的东西)。
战略或实施中存在缺陷吗?我可以采取哪些步骤来解决这个问题?
答案 0 :(得分:2)