如何将自定义3°ManyToMany实体的字段从窗体绑定到弹簧?

时间:2019-04-28 19:06:40

标签: java spring-mvc many-to-many

我正在使用Spring 4.2.5.RELEASE和Hibernate 5.3.1.Final。

我有2个实体:AnagraicaProdotto(produtcs)和Fattura(invoice),从中带有第三个表“ fattura_prodotto”,其中包含PK / FK(产品,发票)和其他列。

我想知道如何使用spring mvc(initbinder)构建一个表单,该表单可以创建(服务器端)我填写了该表单的“集合”。

我当时正在考虑通过使用单个INPUT标签元素手动进行操作(如果spring尚无解决方案),则将其投入链接到他的initbinder中输入一次,然后从那里调用POST传递的所有其他参数,但是可以通过initbinder的“ WebDataBinder”来做到这一点。

我对PRODOTTO的映射是:

    @Entity
    @Table(name="anagrafica_prodotto", schema = "public")
    public class AnagraficaProdotto implements Serializable{

        private static final long serialVersionUID = -8508698695869087L;

        @Id
        @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="anagrafica_prodotto")
        @SequenceGenerator(name="anagrafica_prodotto", sequenceName = "anagrafica_prodotto_seq", allocationSize=1)  
        @Column(name="id_prodotto", nullable=false)
        private Long idProdotto;

        @Column(name="nome", nullable=false)
        private String nome;

        @ManyToMany
        @JoinTable(name = "categoria_prodotto",
            joinColumns = @JoinColumn(name = "id_prodotto"),
            inverseJoinColumns = @JoinColumn(name = "id_categoria"))
        private Set<Categoria> categorie = new HashSet<Categoria>();

        @OneToMany(
                mappedBy = "prodotto",
                cascade = CascadeType.ALL,
                orphanRemoval = true
       )
       private Set<FatturaProdotto> fatture = new HashSet<>();

        public AnagraficaProdotto(Long idProdotto) {
            super();
            this.idProdotto = idProdotto;
        }

        public AnagraficaProdotto() {}

        /* POJO REMOVED in this example*/

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((idProdotto == null) ? 0 : idProdotto.hashCode());
            return result;
        }


        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            AnagraficaProdotto other = (AnagraficaProdotto) obj;
            if (idProdotto == null) {
                if (other.idProdotto != null)
                    return false;
            } else if (!idProdotto.equals(other.idProdotto))
                return false;
            return true;
        }

    }

Fattura的映射是:

        @Entity
        @Table(name="fattura", schema = "public")
        public class Fattura {
            @Id
            @GeneratedValue(strategy=GenerationType.IDENTITY)
            @Column(name="id_fattura")
            private Integer idFattura;

            @Column(name="iva")
            private BigDecimal iva;

            @ManyToOne(fetch=FetchType.LAZY)
            @JoinColumn(name="id_spedizione",nullable=false)
            private Spedizione spedizione;

            @OneToMany(
                    mappedBy = "fattura",
                    cascade = CascadeType.ALL,
                    orphanRemoval = true
           )
           private Set<FatturaProdotto> prodotti = new HashSet<>();


            public Fattura(Integer idFattura) {
                this.idFattura = idFattura;
            }

            public Fattura() {}

            /* POJO removed*/


            @Override
            public int hashCode() {
                final int prime = 31;
                int result = 1;
                result = prime * result + ((idFattura == null) ? 0 : idFattura.hashCode());
                return result;
            }

            @Override
            public boolean equals(Object obj) {
                if (this == obj)
                    return true;
                if (obj == null)
                    return false;
                if (getClass() != obj.getClass())
                    return false;
                Fattura other = (Fattura) obj;
                if (idFattura == null) {
                    if (other.idFattura != null)
                        return false;
                } else if (!idFattura.equals(other.idFattura))
                    return false;
                return true;
            }

        }

我对FATTURA_PRODOTTO的映射是:

    @Entity
    @Table(name="fatture_prodotto", schema = "public")
    public class FatturaProdotto implements Serializable{

        private static final long serialVersionUID = -8500170585876119087L;


        @EmbeddedId
        FatturaProdottoPK idFatturaProdotto;

        @MapsId("idProdotto")
        @ManyToOne
        @JoinColumn(name="id_prodotto", referencedColumnName="id_prodotto")
        private AnagraficaProdotto prodotto;

        @MapsId("idFattura")
        @ManyToOne
        @JoinColumn(name="id_fattura", referencedColumnName="id_fattura")
        private Fattura fattura;

        @DateTimeFormat(pattern = "dd/MM/yyyy")
        @Temporal(TemporalType.DATE)
        @Column(name="data_acquisto", nullable=false)
        private Date dataAcquisto;

        @Column(name="Importo_totale", nullable=false)
        private BigDecimal ImportoTotale;

        @Column(name="quantita", nullable=false)
        private BigInteger quantita;

        public FatturaProdotto(AnagraficaProdotto prodotto, Fattura fattura) {
            super();
            this.prodotto = prodotto;
            this.fattura = fattura;
            this.idFatturaProdotto = new FatturaProdottoPK(prodotto, fattura);
        }

        public FatturaProdotto(Long idProdotto, Integer idFattura) {
            super();
            this.prodotto = new AnagraficaProdotto(idProdotto);
            this.fattura = new Fattura(idFattura);
        }

        public FatturaProdotto() {}

        /* POJO removed */


        @Override
        public boolean equals(Object o) {
            if (this == o) return true;

            if (o == null || getClass() != o.getClass())
                return false;

            FatturaProdotto that = (FatturaProdotto) o;
            return Objects.equals(fattura, that.fattura) &&
                   Objects.equals(prodotto, that.prodotto);
        }

        @Override
        public int hashCode() {
            return Objects.hash(fattura, prodotto);
        }

    }

表格:

    CREATE TABLE public.anagrafica_azienda
    (
        p_iva character varying(10) COLLATE pg_catalog."default" NOT NULL,
        nome character varying(25) COLLATE pg_catalog."default",
        id_categoria numeric,
        --id_prodotto numeric NOT NULL, --TODO da mettere?
        CONSTRAINT "ANAGRAFICA_AZIENDA_pkey" PRIMARY KEY (p_iva),
        CONSTRAINT "FK_ANAG_AZ_CATEGORIA" FOREIGN KEY (id_categoria)
            REFERENCES public.categoria (id_categoria) MATCH SIMPLE
            ON UPDATE NO ACTION
            ON DELETE NO ACTION
    )

CREATE TABLE public.fattura
(
    id_fattura SERIAL NOT NULL,
    iva numeric,
    id_spedizione character varying(26) COLLATE pg_catalog."default",
    CONSTRAINT "Fattura_pkey" PRIMARY KEY (id_fattura),
    CONSTRAINT "FK_FATTURA_SPEDIZIONE" FOREIGN KEY (id_spedizione)
        REFERENCES public.spedizione (traking) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)

CREATE TABLE public.fatture_prodotto
(
    id_fattura SERIAL NOT NULL,
    id_prodotto numeric NOT NULL,
    data_acquisto date NOT NULL,
    importo_totale numeric(11,6) NOT NULL,
    quantita numeric(4,0) NOT NULL,
    CONSTRAINT fatture_prodotto_pkey PRIMARY KEY (id_prodotto, id_fattura),
    CONSTRAINT "FK_FATTURA_PRODOTTO_PRODOTTO" FOREIGN KEY (id_prodotto)
        REFERENCES public.anagrafica_prodotto (id_prodotto) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT "FK_FATTURA_PRODOTTO_FATTURA" FOREIGN KEY (id_fattura)
        REFERENCES public.fattura (id_fattura) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
        ).

在用于编辑FATTURA的页面期间,我想在每次需要时创建用于填充有关单个对象FatturaProdotto的信息的字段(当需要用户时)。 这样做非常简单,但是我不知道要构建填充的输入,以使它们可以从Spring mvc中识别为FatturaProdotto类型的列表。

对于由DB中现有元素组成的其他列表,使用form:checkboxes,initbinder从所有INPUT创建具有相同“路径”(名称)的列表,该列表表示我将检索到的ID。.但是我该怎么办这与需要更多数据的复杂对象x列表中的对象?

谢谢。

0 个答案:

没有答案