Я ищу решение для проверки дублирующего ключа, прежде чем передать свою 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, есть ли способ?
Есть идеи?
Как насчет этого (по предложению Светлина Зарева):
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 { }
});
Измените свою БД на уникальные индексы. Он будет генерировать исключение, когда вы попытаетесь вставить дубликаты данных.