Чтобы поймать причину уникального ограничения на JPA - PullRequest
4 голосов
/ 30 июля 2010

Я пытаюсь выучить JPA, и у меня возникла проблема, с которой я столкнулся уже 2 дня.

У меня есть таблица с именем «Пользователь», содержащая идентификатор, электронную почту, пароль, имя пользователя и статус.

Как вы думаете, столбцы электронной почты и имени пользователя уникальны.

У меня также есть класс с именем 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; 

Остальная часть этого класса - геттеры и сеттеры.

Я пытаюсь вставить значение с помощью 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 ]

2 голосов
/ 10 сентября 2010

Вы не должны использовать автоматически созданные схемы в производстве, так почему бы просто не установить имя ограничения в вашей схеме. Затем, когда будет сгенерировано исключение, вы получите неверное имя ограничения.

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

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

Возможно, вы захотите заглянуть в базу данных, прежде чем вставлять, чтобы увидеть, если они уже есть ... таким образом, вы, скорее всего, в любом случае не получите исключение ...

0 голосов
/ 09 августа 2010

Попробуйте это:

catch(javax.validation.ConstraintViolationException exception) {
    Set<ConstraintViolation<?>> constraintViolations = exception.getConstraintViolations();
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...