Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当一个实体的两个字段为(unique=true)时,如何处理JPA异常?_Java_Hibernate_Jpa - Fatal编程技术网

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应用程序的话。在操作本身传播到服务层并引发异常之前,执行搜索以查看数据库中是否已经存在条目。