了解JPA独特约束的原因

时间:2010-07-30 15:31:50

标签: java hibernate jpa

我正在尝试学习JPA,我有一个问题,我在2天后陷入困境。

我有一个名为“用户”的表格,包括ID,电子邮件,密码,用户名和状态。

您认为电子邮件和用户名列是唯一的。

我还有一个名为User的类:

@Entity
@Table(name = "user", uniqueConstraints = @UniqueConstraint(columnNames = {"username", "email"}))
public class User {    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    @Column(name="email", nullable=false)
    private String email;
    @Column(name="password", nullable=false)
    private String password;
    @Column(name="username", nullable=false)
    private String username;
    @Column(name="status", nullable=false)
    private String status; 

本课程的其余部分是getter和setter。

我正在尝试使用JPA和Hibernate插入一个值。

    try {
            em = jpaResourceBean.getEMF().createEntityManager();
            em.getTransaction().begin();
            user.setStatus(UserStatus.PENDING.toString());
            em.persist(user);
            em.getTransaction().commit();
            logger.info("User " + user.getUsername() + " has been registered");
    // Attention starts
        } catch (XXXXXX) { 
    if (XXXXX.getYYY().equals("ZZZZZ")) logger.info("User name is already exist");
    if (XXXXX.getMMM().equals("LLLLL")) logger.info("Email is already exist");
        } 
    // Attention end

我只想知道:我如何理解用户名约束或电子邮件唯一约束的问题?虽然您可以检查我的注意开始和结束块,但我确信您明白了我的观点:)

提前致谢。

2 个答案:

答案 0 :(得分:2)

您不应该在生产中使用自动生成的模式,所以为什么不在模式中简单地设置约束名称。然后,当生成异常时,您将获得失败的约束名称。

create table users (
      user varchar2(20) not null,
      email varchar2(20) not null,

      constraint user_uq unique(user),
      constraint email_uq unique(email)
)

您可能希望在插入之前查看数据库,看看它们是否已经存在..那么您很可能不会得到异常......

答案 1 :(得分:0)

试试这个:

catch(javax.validation.ConstraintViolationException exception) {
    Set<ConstraintViolation<?>> constraintViolations = exception.getConstraintViolations();
...
}