我正在使用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列表中的对象?
谢谢。