Проверить дубликат ключа перед фиксацией?

1

Я ищу решение для проверки дублирующего ключа, прежде чем передать свою BeanFieldGroup с помощью JPAContainer. Там какое-то решение для этого без использования CriteriaQuery? Например, когда я выполняю коммит, есть способ проверить, существует ли ключ в базе данных и возвращает исключение?

Я пытаюсь это

@Entity
@Table(name="curriculum")
public class Curriculum implements Serializable{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Long idCurriculum;

    @Email
    @NotEmpty
    @NotNull
    @Size(max=250)
    @Column(unique=true)
    private String email;
}

/** BeanFieldGroup */   
private final BeanFieldGroup<Curriculum> binder = new BeanFieldGroup<Curriculum>(Curriculum.class);
private final Curriculum bean = new Curriculum();


/** datasources */
private final CustomJPAContainer<Curriculum> datasource = new CustomJPAContainer<Curriculum>(Curriculum.class);


private VerticalLayout buildLayout(){
    vLayout = new VerticalLayout();
    vLayout.setMargin(true);
    vLayout.setSpacing(true);
    binder.setItemDataSource(bean);             
    Field<?> field = null;

    //email unique key on database
    field = binder.buildAndBind("Email", "email", TextLower.class);
    email = (TextLower)binder.getField("email");
    email.setWidth("350px");
    email.setMaxLength(250);
    vLayout.addComponent(email);
            return vLayout;

    }  

    @Override
public void buttonClick(ClickEvent event) {
    if((event.getButton()) == btnSalvar){
        try {
            binder.commit();
        } catch (CommitException e) {
            Notification.show(e.getMessage(), 
                              Type.ERROR_MESSAGE);
        }

        try {                                
            datasource.addEntity(binder.getItemDataSource().getBean());
        } catch(Exception e) {              
                Notification.show(e.getMessage(), 
                                  Type.ERROR_MESSAGE);
                return;
        }
    }

После make commit я делаю: datasource.addEntity(binder.getItemDataSource(). GetBean()); если datasource.addEntity() не работает и выполняет генерическое исключение.

Как проверить, действительно ли поле электронной почты уже существует в базе данных до фиксации без использования CriteriaQuery, есть ли способ?

Есть идеи?

  • 3
    Я хотел бы создать уникальный индекс (или ограничение) для столбца электронной почты, а затем устранить ошибку (= исключение) в коде.
  • 0
    в моем Бине (Учебный план) у меня есть аннотация @Column (unique = true) для атрибута электронной почты
Показать ещё 3 комментария
Теги:
jpa
vaadin7

2 ответа

1
Лучший ответ

Как насчет этого (по предложению Светлина Зарева):

binder.addCommitHandler(new CommitHandler()
{
    @Override
    public void preCommit(CommitEvent commitEvent) throws CommitException
    {
        String email = (String) commitEvent.getFieldBinder().getField("email").getValue();

        EntityManager em = /* retrieve your EntityManager */;

        List<?> results = em.createQuery("select idCurriculum from Curriculum where email = ?")
                            .setParameter(1, email)
                            .getResultList();

        if (results.size() > 0)
            throw new CommitException("Email already exists");
    }

    @Override
    public void postCommit(CommitEvent commitEvent) throws CommitException { }
});
0

Измените свою БД на уникальные индексы. Он будет генерировать исключение, когда вы попытаетесь вставить дубликаты данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню