Как связать поля пользовательского объекта 3 ° ManyToMany от формы до весны? - PullRequest
0 голосов
/ 28 апреля 2019

Я использую пружину 4.2.5.RELEASE и Hibernate 5.3.1.Final.

У меня есть 2 объекта: AnagraicaProdotto (produtcs) и Fattura (счет-фактура), из которого выходит 3-я таблица "fattura_prodotto" с PK / FK (продукт, счет-фактура) и другими столбцами.

Я хотел бы знать, как с помощью Spring mvc (initbinder) я могу создать форму, которая может создать (на стороне сервера) «Набор», который я заполнил в форме.

Я думал сделать это вручную (если у Spring нет решения), используя один элемент тега INPUT, бросить его ввод один раз в привязку initbinder, связанную с ним, и оттуда вызывать все остальные параметры, передаваемые POST, но ни может сделать это с помощью 'WebDataBinder' initbinder.

Мое отображение для 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.

Для других списков, которые состоят из существующего элемента в БД, используя флажки form:, initbinder создает список из всех входов с тем же «путем» (именем), представляющим идентификатор, который я получу ... но как я могу это сделать это с более сложными объектами, которые требуют больше данных x объект списка ??

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...