Java 弹簧&x2B;JPA@OneToMany,带孤儿院
我在Spring列表表单绑定和删除方面有点(大)问题。此异常仅在更新某些项时发生-插入和删除有效 “拥有实体实例不再引用cascade=“all delete orphan”的集合:me.gerenciar.model.entity.PedidoItem.filhos” 我有一个表单,在这个表单中,有一些项目(子项)在前端用javascript动态插入/删除/更新 我还制作了两个类似的表单,它们工作得非常完美,唯一的区别是,在这一个表单中,我们有3个层次级别,其他的只有1个层次级别 我知道所有我们不能这样设置新字典的东西:“this.children=children”;但是这是Spring在绑定表单实体时通过反射生成的。正如我所说,它在另外两个案例中也起了作用 这里是我的实体(没有getter和setter)Java 弹簧&x2B;JPA@OneToMany,带孤儿院,java,spring,hibernate,spring-mvc,jpa,Java,Spring,Hibernate,Spring Mvc,Jpa,我在Spring列表表单绑定和删除方面有点(大)问题。此异常仅在更新某些项时发生-插入和删除有效 “拥有实体实例不再引用cascade=“all delete orphan”的集合:me.gerenciar.model.entity.PedidoItem.filhos” 我有一个表单,在这个表单中,有一些项目(子项)在前端用javascript动态插入/删除/更新 我还制作了两个类似的表单,它们工作得非常完美,唯一的区别是,在这一个表单中,我们有3个层次级别,其他的只有1个层次级别 我知道所有我
//BaseEntity只是覆盖equals、toString和hashCode的一种通用方法
@实体
@表(name=“PEDIDO”)
公共类Pedido扩展了BaseEntity
{
私有静态最终长serialVersionUID=1586104653460442257L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“ID\u PEDIDO”)
私有整数足形;
@manytone(fetch=FetchType.EAGER)
@JoinColumn(name=“ID\u PESSOA\u Establecimento”)
私人地产;
@manytone(fetch=FetchType.EAGER)
@JoinColumn(name=“ID\u PESSOA\u客户”)
私人客户;
@manytone(fetch=FetchType.EAGER)
@JoinColumns({@JoinColumn(name=“ID_-MESA”,referencedColumnName=“ID_-MESA”,insertable=false,updateable=false),@JoinColumn(name=“ID_-PESSOA\u establecimento”,referencedColumnName=“ID_-PESSOA”,insertable=false,updateable=false)})
私人台地;
@manytone(fetch=FetchType.EAGER)
@JoinColumn(name=“ID\u TURNO”)
私人Turno Turno;
@DateTimeFormat(iso=iso.DATE\u时间)
@列(name=“DATA”)
私人日期数据;
@列(name=“DATA”,updateable=false,insertable=false)
私有字符串数据;
@列(name=“PRECO”)
私有big-preco;
@列(name=“FINALIZADO”)
私有布尔运算;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy=“pedido”,orphan=true)
@订购人(“ID\U PEDIDO\U ITEM\U GRUPO DESC”)
私有列表pedidoItemGrupos;
@列(name=“DATA\u ANO”)
私有整数dataAno;
@列(name=“DATA_MES”)
私有整数数据集;
@列(name=“数据直径”)
私有整数数据媒体;
@manytone(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinColumn(name=“ID\u支票”)
私人支票;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,orphan=true)
@JoinTable(name=“PEDIDO\u CARTAO”,joinColumns={@JoinColumn(name=“ID\u PEDIDO”,referencedColumnName=“ID\u PEDIDO”)},inverseJoinColumns={@JoinColumn(name=“ID\u CARTAO”,referencedColumnName=“ID\u CARTAO”)})
私人名单卡通;
@manytone(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinColumn(name=“ID_DINHEIRO”)
私人迪涅罗迪涅罗;
@manytone(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinColumn(name=“ID\u BOLETO”)
私人博莱托博莱托;
}
@实体
@表(name=“PEDIDO\u项目\u GRUPO”)
公共类PedidoItemGrupo扩展了BaseEntity
{
私有静态最终长serialVersionUID=7785627059444833691L;
公共静态枚举Tipo
{
迪维迪多,索马多
}
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“ID\u PEDIDO\u ITEM\u GRUPO”)
私有整数pedidoItemGrupoId;
@杰索尼奥雷
@manytone(fetch=FetchType.EAGER)
@JoinColumn(name=“ID\u PEDIDO”)
私人佩迪多;
@列(name=“QUANTIDADE”)
私有大十进制量化;
@列(name=“PRECO_UNITARIO”)
私营大企业;
@列(name=“PRECO”)
私有big-preco;
@列(name=“descon”)
私人大公司;
@列(name=“PRECO_FINAL”)
私人决赛;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy=“pedidoItemGrupo”,orphanRemoving=true)
@其中(子句=“存在(从ID为空的PEDIDO\u项目中选择*))
私人名单;
}
@实体
@表(name=“PEDIDO\u项目”)
公共类PedidoItem扩展了BaseEntity
{
私有静态最终长serialVersionUID=5296905009119022656L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“ID\u PEDIDO\u项目”)
私有整数pedidoItemId;
@杰索尼奥雷
@manytone(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinColumn(name=“ID\u PEDIDO\u ITEM\u PAI”)
私人足部;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“pai”,fetch=FetchType.EAGER,orphan=true)
私人名单菲洛斯;
@manytone(fetch=FetchType.EAGER)
@JoinColumn(name=“ID\u PRODUTO”,insertable=false,updateable=false)
私人生产商;
@manytone(fetch=FetchType.EAGER)
@JoinColumn(name=“ID\u PRODUTO\u CATEGORIA”)
私人产品分类产品分类;
@manytone(fetch=FetchType.EAGER)
@JoinColumns({@JoinColumn(name=“ID\u PRODUTO”,referencedColumnName=“ID\u PRODUTO”),@JoinColumn(name=“TAMANHO”,referencedColumnName=“TAMANHO”))
私人ProdutoTamanho ProdutoTamanho;
@杰索尼奥雷
@manytone(fetch=FetchType.EAGER)
@JoinColumn(name=“ID\u PEDIDO\u ITEM\u GRUPO”)
私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人住宅;
@列(name=“QUANTIDADE”)
私有大十进制量化;
@列(name=“PRECO_UNITARIO”)
私营大企业;
@列(name=“PRECO”)
私有big-preco;
@列(name=“descon”)
私有大十进制描述
//BaseEntity is just a generic way to override equals, toString and hashCode
@Entity
@Table(name = "PEDIDO")
public class Pedido extends BaseEntity
{
private static final long serialVersionUID = 1586104653460442257L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID_PEDIDO")
private Integer pedidoId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_PESSOA_ESTABELECIMENTO")
private Estabelecimento estabelecimento;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_PESSOA_CLIENTE")
private Cliente cliente;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumns({ @JoinColumn(name = "ID_MESA", referencedColumnName = "ID_MESA", insertable = false, updatable = false), @JoinColumn(name = "ID_PESSOA_ESTABELECIMENTO", referencedColumnName = "ID_PESSOA", insertable = false, updatable = false) })
private Mesa mesa;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_TURNO")
private Turno turno;
@DateTimeFormat(iso = ISO.DATE_TIME)
@Column(name = "DATA")
private Date data;
@Column(name = "DATA", updatable = false, insertable = false)
private String rawData;
@Column(name = "PRECO")
private BigDecimal preco;
@Column(name = "FINALIZADO")
private Boolean finalizado;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "pedido", orphanRemoval = true)
@OrderBy("ID_PEDIDO_ITEM_GRUPO DESC")
private List<PedidoItemGrupo> pedidoItemGrupos;
@Column(name = "DATA_ANO")
private Integer dataAno;
@Column(name = "DATA_MES")
private Integer dataMes;
@Column(name = "DATA_DIA")
private Integer dataDia;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "ID_CHEQUE")
private Cheque cheque;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@JoinTable(name = "PEDIDO_CARTAO", joinColumns = { @JoinColumn(name = "ID_PEDIDO", referencedColumnName = "ID_PEDIDO") }, inverseJoinColumns = { @JoinColumn(name = "ID_CARTAO", referencedColumnName = "ID_CARTAO") })
private List<Cartao> cartoes;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "ID_DINHEIRO")
private Dinheiro dinheiro;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "ID_BOLETO")
private Boleto boleto;
}
@Entity
@Table(name = "PEDIDO_ITEM_GRUPO")
public class PedidoItemGrupo extends BaseEntity
{
private static final long serialVersionUID = 7785627059444833691L;
public static enum Tipo
{
DIVIDIDO, SOMADO
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID_PEDIDO_ITEM_GRUPO")
private Integer pedidoItemGrupoId;
@JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_PEDIDO")
private Pedido pedido;
@Column(name = "QUANTIDADE")
private BigDecimal quantidade;
@Column(name = "PRECO_UNITARIO")
private BigDecimal precoUnitario;
@Column(name = "PRECO")
private BigDecimal preco;
@Column(name = "DESCONTO")
private BigDecimal desconto;
@Column(name = "PRECO_FINAL")
private BigDecimal precoFinal;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "pedidoItemGrupo", orphanRemoval = true)
@Where(clause = "EXISTS (SELECT * FROM PEDIDO_ITEM WHERE ID_PEDIDO_ITEM_PAI IS NULL)")
private List<PedidoItem> pedidoItens;
}
@Entity
@Table(name = "PEDIDO_ITEM")
public class PedidoItem extends BaseEntity
{
private static final long serialVersionUID = 5296905009119022656L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID_PEDIDO_ITEM")
private Integer pedidoItemId;
@JsonIgnore
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "ID_PEDIDO_ITEM_PAI")
private PedidoItem pai;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "pai", fetch = FetchType.EAGER, orphanRemoval = true)
private List<PedidoItem> filhos;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_PRODUTO", insertable = false, updatable = false)
private Produto produto;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_PRODUTO_CATEGORIA")
private ProdutoCategoria produtoCategoria;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumns({ @JoinColumn(name = "ID_PRODUTO", referencedColumnName = "ID_PRODUTO"), @JoinColumn(name = "TAMANHO", referencedColumnName = "TAMANHO") })
private ProdutoTamanho produtoTamanho;
@JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_PEDIDO_ITEM_GRUPO")
private PedidoItemGrupo pedidoItemGrupo;
@Column(name = "QUANTIDADE")
private BigDecimal quantidade;
@Column(name = "PRECO_UNITARIO")
private BigDecimal precoUnitario;
@Column(name = "PRECO")
private BigDecimal preco;
@Column(name = "DESCONTO")
private BigDecimal desconto;
@Column(name = "PRECO_TOTAL_UNITARIO")
private BigDecimal precoTotalUnitario;
@Column(name = "PRECO_TOTAL")
private BigDecimal precoTotal;
@Column(name = "PRECO_TOTAL_FINAL")
private BigDecimal precoTotalFinal;
}
class Child {
private List<Child> children = new ArrayList<>();
public setChildren(List<Child> children)
{
this.children.clear();
if (children != null) {
this.children.addAll(children);
}
}
}
class Child extends BaseEntity {
private List<Child> children = new ArrayList<>();
public setChildren(List<Child> children)
{
//this is the magic method, doing with Reflection on BaseEntity
setList(this.children, children);
}
}