java - Spring + JPA @OneToMany with orphanRemoval -
i'm having little (big) problem spring list form binding, , orphanremoval. exception occurs when updating item - insert , delete work.
"a collection cascade="all-delete-orphan" no longer referenced owning entity instance: me.gerenciar.model.entity.pedidoitem.filhos"
well, have form, , in form, there items (children) dynamically inserted/deleted/updated on front-end javascript.
i've made 2 other forms one, , works perfectly, difference in one, have 3 hierarchy level, , others 1 hierarchy level.
i know stuff can not set new dictionary this: "this.children = children;" made spring reflection when binding form entity. , had said, did work on 2 other cases.
here entities (without getters , setters).
//baseentity generic way override equals, tostring , 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 * pedido_item id_pedido_item_pai 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; } if guys need more details i'll post it. thank much!
i have tried also: http://mcls.github.io/blog/2012/08/07/pojo-binding-and-jpas-orphanremoval-in-play/
no succeed =(, got null pointer exception when spring try bind list filhos
so, im gonna answer own question.
for guys, facing same problem pojo binding hibernate entity.
the solution pre-instanciate collections, , replace normal set method one
class child { private list<child> children = new arraylist<>(); public setchildren(list<child> children) { this.children.clear(); if (children != null) { this.children.addall(children); } } } this way, gonna kill other children... of course specific setter method, , generic way reflection, , "update" needed children, , "remove" others.
so, final version this:
class child extends baseentity { private list<child> children = new arraylist<>(); public setchildren(list<child> children) { //this magic method, doing reflection on baseentity setlist(this.children, children); } }
Comments
Post a Comment