有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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;
    }

谢谢!


共 (2) 个答案

  1. # 1 楼答案

    一种方法是,在执行createAccount之前,根据username进行搜索,如果它返回一条记录,那么这意味着username已经返回了适当的消息,你也可以对email进行同样的搜索

    如果两个搜索都返回none,那么您知道这是一个新帐户,并执行createAccount

  2. # 2 楼答案

    好吧,你可以在尝试持久化一个对象之前检查重复项,然后根据结果,返回正确的错误,或者持久化该对象