Я использую пружину 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 объект списка ??
Спасибо.