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

Popular posts from this blog

cakephp - simple blog with croogo -

How to group boxplot outliers in gnuplot -

bash - Performing variable substitution in a string -