java当一个实体的两个字段为(unique=true)时,如何处理JPA异常?
假设我有以下实体:
@Entity
@Table(name = "accounts")
public class AccountImpl implements Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, unique = true)
private Long id;
@Column(name = "email", nullable = false, unique = true)
private String email;
@Column(name = "username", nullable = false, unique = true)
private String username;
// constructor + getters
}
电子邮件和用户名字段设置为唯一。现在,如果使用另一个对象的重复电子邮件或用户名创建一个对象,JPA将抛出持久性异常。如何创建单独的处理程序来处理重复的电子邮件和用户名
Account account = new AccountImpl(email, username, password, role);
try {
service.createAccount(account);
} catch(javax.persistence.PersistenceException e) {
addFieldError("username", "Username taken");
// Oh crap! What if the exception has been thrown by email?
return INPUT;
}
谢谢!
# 1 楼答案
一种方法是,在执行
createAccount
之前,根据username
进行搜索,如果它返回一条记录,那么这意味着username
已经返回了适当的消息,你也可以对email
进行同样的搜索如果两个搜索都返回
none
,那么您知道这是一个新帐户,并执行createAccount
# 2 楼答案
好吧,你可以在尝试持久化一个对象之前检查重复项,然后根据结果,返回正确的错误,或者持久化该对象