【发布时间】:2017-07-03 11:24:14
【问题描述】:
我正在尝试使用 JPA 在我的 JavaEE 应用程序中的 DAO 中实现一些错误处理。
我遇到了某人(用户)可能尝试将重复项输入我的数据库的情况。我的计划是尝试坚持我的实体,例如。用户(“test@test.com”,“测试”,“密码”)。如果这失败并出现 PersistenceException 我想我可以检查唯一列上的重复条目,如用户名(“Test”)和电子邮件(“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());
}
该实体还有一个 ID 列,其注释为 @GeneratedValue(strategy = GenerationType.IDENTITY)。还有一个@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: ********)
目前我让容器处理事务,但我有预感我遇到了这些问题,因为我试图在第一个事务完成之前查询数据库(或类似的东西)。
是策略上的缺陷还是执行上的缺陷?我可以采取哪些步骤来开始解决这个问题?
【问题讨论】:
-
神秘的
getEntityManager()长什么样子? -
啊,这是注入成员的吸气剂。我将实体管理器注入
@PersistenceContext(unitName = "RecruitmentPU") protected EntityManager mEM;到同一个类(标记为@Stateless)。我已经用信息更新了问题。 -
你如何在
findDuplicate()中使用entity对象 -
用户是否有一个额外的字段,称为
ID,它是一个auto-invrement字段? -
我使用实体来获取哪个列是唯一的,以及实体实例的该列的值,为问题添加了基础知识。是的,用户实体有一个自动生成的 ID 列,并且它还在简化示例中未显示的列上具有多对一关系。
标签: jpa jakarta-ee transactions persistence