Java 当一个实体的两个字段为(unique=true)时,如何处理JPA异常?
假设我有以下实体:Java 当一个实体的两个字段为(unique=true)时,如何处理JPA异常?,java,hibernate,jpa,Java,Hibernate,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
@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;
}
谢谢一种方法是在执行
createAccount
之前,根据用户名
进行搜索,如果它返回一条记录,那么这意味着用户名
已经被接收并返回相应的消息,你也可以对电子邮件
执行同样的操作
如果两个搜索都返回
none
,则您知道这是一个新帐户,并执行createAccount
,那么您可以在尝试持久化对象之前检查重复项,并根据结果返回正确的错误,或持久化对象 谢谢你的回答,但这不会降低我的应用程序的性能吗?这不应该在服务层进行,而应该在web层进行,如果它是web应用程序的话。在操作本身传播到服务层并引发异常之前,执行搜索以查看数据库中是否已经存在条目。