有 Java 编程相关的问题?

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

java在提交前检查重复密钥?

我正在寻找一种解决方案,在使用JPA容器提交BeanFieldGroup之前检查重复密钥。有没有一个不使用CriteriaQuery的解决方案? 例如,当我执行commit时,有某种方法可以检查数据库中是否已经存在密钥并返回异常

我在试这个

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

在进行提交之后,我做了:datasource。addEntity(binder.getItemDataSource()。getBean());如果是数据源。addEntity()不起作用,但执行一般异常

如何在提交之前检查数据库中是否已经存在电子邮件字段而不使用CriteriaQuery,有一种方法吗

有什么想法吗


共 (2) 个答案

  1. # 1 楼答案

    将数据库更改为具有唯一索引。当您尝试插入重复数据时,它将引发异常

  2. # 2 楼答案

    这个怎么样(根据斯维特林·扎雷夫的建议):

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