我对Spring列表表单绑定和orphanRemoval存在一些问题(大)。只有在更新某个项目时才会出现此异常 - 插入和删除确实有效。Spring + JPA @OneToMany with orphanRemoval
“与级联集合=”全删除,孤儿“由所拥有的实体实例不再被引用:me.gerenciar.model.entity.PedidoItem.filhos”
嗯,我有一个表单,在这种形式下,有一些项目(子项)是动态插入/删除/更新前端的JavaScript。
我做了两个这样的形式,它们完美地工作,唯一的区别在于,在这一个中,我们有3个层次结构级别,其他只有1个层次结构级别。
我知道所有那些我们不能像这样设置新词典的东西:“this.children = children;”但这是由Spring在绑定表单实体时反射而成的。正如我所说的那样,它在其他两种情况下也有效。
这里是我的实体(没有getters和setters)。
//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;
}
如果你们需要更多的细节,我会立即发布它。 非常感谢你!
我已经试过这也:http://mcls.github.io/blog/2012/08/07/pojo-binding-and-jpas-orphanremoval-in-play/
没有成功=(,得到了当春天尝试绑定列表FILHOS