如何只保存选择多个复选框中的一项?

时间:2014-02-05 22:53:13

标签: jsf jsf-2

当我要约创建一个oferta对象(商品)时,它会保存选择多个复选框中的所有商品(这是根据公司选择的位置(empresa)),而不仅仅是已选中的商品:

非常感谢您提供的任何帮助。

                <h:outputLabel value="#{bundle.CreateOfertaLabel_empresaidEmpresa}" for="empresaidEmpresa" />                                        
                <h:selectOneMenu id="empresaidEmpresa" 
                                 value="#{ofertaController.selected.empresaidEmpresa}" 
                                 title="#{bundle.CreateOfertaTitle_empresaidEmpresa}"
                                 required="true"  
                                 requiredMessage="#{bundle.CreateOfertaRequiredMessage_empresaidEmpresa}">
                    <f:ajax event="valueChange" execute="empresaidEmpresa" render="ubicacionCollection" />
                    <f:selectItems value="#{empresaController.itemsAvailableSelectOne}"/>
                </h:selectOneMenu>

                <h:outputLabel value="#{bundle.CreateOfertaLabel_ubicacionCollection}" for="ubicacionCollection" />      
                <h:selectManyCheckbox id="ubicacionCollection"
                                      value="#{ubicacionXEmpresa}"
                                      title="#{bundle.CreateOfertaTitle_ubicacionCollection}" >                    
                    <f:converter id="ubicacionConverter" converterId="ubicacionConverter"/>
                    <f:selectItems id="ubicacionCollectionItems"
                                   value="#{ofertaController.selected.empresaidEmpresa.ubicacionCollection}"
                                   var="ubicacionXEmpresa"
                                   itemLabel="#{ubicacionXEmpresa.barrio}"
                                   itemValue="#{ubicacionXEmpresa}"/>
                </h:selectManyCheckbox>

你的正确行应该是:

                    <h:outputLabel value="#{bundle.CreateOfertaLabel_ubicacionCollection}" for="ubicacionCollection" />      
                <h:selectManyCheckbox id="ubicacionCollection"
                                      value="#{ofertaController.selected.ubicacionCollection}"
                                      title="#{bundle.CreateOfertaTitle_ubicacionCollection}" >                    
                    <f:converter id="ubicacionConverter" converterId="ubicacionConverter"/>
                    <f:selectItems id="ubicacionCollectionItems"
                                   value="#{ofertaController.selected.empresaidEmpresa.ubicacionCollection}"
                                   var="ubicacionXEmpresa"
                                   itemLabel="#{ubicacionXEmpresa.barrio}"
                                   itemValue="#{ubicacionXEmpresa}"/>
                </h:selectManyCheckbox>

但知情面孔在创建报价时向我展示了

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '32-1' for key 'PRIMARY' Error Code: 1062 Call: INSERT INTO oferta_has_ubicacion (ubicacion_idUbicacion, oferta_idOferta) VALUES (?, ?) bind => [2 parameters bound] Query: DataModifyQuery(name="ubicacionCollection" sql="INSERT INTO oferta_has_ubicacion (ubicacion_idUbicacion, oferta_idOferta) VALUES (?, ?)")

这是我的创建方法:

   public void create(Oferta oferta) {
    if (oferta.getUbicacionCollection() == null) {
        oferta.setUbicacionCollection(new ArrayList<Ubicacion>());
    }
    if (oferta.getEmpresaCollection() == null) {
        oferta.setEmpresaCollection(new ArrayList<Empresa>());
    }
    EntityManager em = null;
    try {
        em = getEntityManager();
        em.getTransaction().begin();
        Empresa empresaidEmpresa = oferta.getEmpresaidEmpresa();
        if (empresaidEmpresa != null) {
            empresaidEmpresa = em.getReference(empresaidEmpresa.getClass(), empresaidEmpresa.getIdEmpresa());
            oferta.setEmpresaidEmpresa(empresaidEmpresa);
        }
        Collection<Ubicacion> attachedUbicacionCollection = new ArrayList<Ubicacion>();
        for (Ubicacion ubicacionCollectionUbicacionToAttach : oferta.getUbicacionCollection()) {
            ubicacionCollectionUbicacionToAttach = em.getReference(ubicacionCollectionUbicacionToAttach.getClass(), ubicacionCollectionUbicacionToAttach.getIdUbicacion());
            attachedUbicacionCollection.add(ubicacionCollectionUbicacionToAttach);
        }
        oferta.setUbicacionCollection(attachedUbicacionCollection);
        Collection<Empresa> attachedEmpresaCollection = new ArrayList<Empresa>();
        for (Empresa empresaCollectionEmpresaToAttach : oferta.getEmpresaCollection()) {
            empresaCollectionEmpresaToAttach = em.getReference(empresaCollectionEmpresaToAttach.getClass(), empresaCollectionEmpresaToAttach.getIdEmpresa());
            attachedEmpresaCollection.add(empresaCollectionEmpresaToAttach);
        }
        oferta.setEmpresaCollection(attachedEmpresaCollection);
        em.persist(oferta);
        if (empresaidEmpresa != null) {
            empresaidEmpresa.getOfertaCollection().add(oferta);
            empresaidEmpresa = em.merge(empresaidEmpresa);
        }
        for (Ubicacion ubicacionCollectionUbicacion : oferta.getUbicacionCollection()) {
            ubicacionCollectionUbicacion.getOfertaCollection().add(oferta);
            ubicacionCollectionUbicacion = em.merge(ubicacionCollectionUbicacion);
        }
        for (Empresa empresaCollectionEmpresa : oferta.getEmpresaCollection()) {
            empresaCollectionEmpresa.getOfertaCollection().add(oferta);
            empresaCollectionEmpresa = em.merge(empresaCollectionEmpresa);
        }
        em.getTransaction().commit();
    } finally {
        if (em != null) {
            em.close();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

          value="#{ofertaController.selected.ubicacionCollection}"

另一个是多对多关系问题jpa问题