Problema ao remover entidades da base de dados(Resolvido)
4 respostas
W
Will_HRock
Pessoal, estou com um problema para remover as entidades na minha base de dados.
Eu possuo no banco de dados 3 entidades(Shopping, Loja e Produto), com um relacionamento um-para-muitos nesta mesma ordem.
Porém quando vou deletar um Shopping que possui uma loja, ou uma loja que possui muitos produtos, vejo o seguinte erro:
O que eu queria é que quando eu removesse uma loja com produtos, os produtos desta loja automaticamente fossem removidos.
Eu até coloquei o atributo cascade = CascadeType.ALL na anotação das entidades, achei que isso era a solução, mas o problema persiste ainda.
Estou usando o NetBeans 6.8, JPA 2.0.
Não sei se é o caso, você não mandou seu código, mas é muito provável que você não tenha configurado suas entidades para aplicar as alterações em cascata. Então, ou vc exclui as entidades na ordem de forma a não causar o conflito, ou então adiciona na anotação do relacionamento como no exemplo:
@OneToMany(cascade=ALL)
Adicionando ALL será aplicado às entidades associadas todas as operações (INSERT, UPDATE, DELETE) de forma implícita.
Acho que não acordei ainda, não vi a segunda parte da sua mensagem, onde vc dizia que já colocou o cascade.ALL.
No caso, tô sem pistas… Pode publicar seu código?
Como eu queria poder apagar uma mensagem… maldito dedo rápido…
W
Will_HRock
Esse é o código da entidade Loja:
packageentities;importjava.util.*;importjavax.persistence.*;importjavax.xml.bind.annotation.*;importjava.io.Serializable;@XmlRootElement@XmlAccessorType(XmlAccessType.FIELD)@Table(name="loja")@SequenceGenerator(name="LOJA_SEQUENCE",sequenceName="loja_seq",initialValue=30,allocationSize=1)@NamedQueries({@NamedQuery(name="Loja.buscarTodas",query="SELECT l FROM Loja l"),@NamedQuery(name="Loja.buscarPorNomeID",query="SELECT l FROM Loja l INNER JOIN l.shoppingId s WHERE l.nome LIKE "+":nomeLoja AND s.shoppingId = :shopId")})@EntitypublicclassLojaimplementsSerializable{@Id@Basic(optional=false)@Column(name="loja_id")@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="LOJA_SEQUENCE")privateLonglojaId;@Basic(optional=false)@Column(name="nome")privateStringnome;@Column(name="andar")privateIntegerandar;@Column(name="telefone")privateStringtelefone;@XmlTransient@OneToMany(mappedBy="loja",cascade=CascadeType.ALL)privateList<Produto>produtos;@JoinColumn(name="shopping_id",referencedColumnName="shopping_id")@ManyToOne@XmlTransientprivateShoppingshoppingId;publicLoja(){}publicLoja(LonglojaId){this.lojaId=lojaId;}publicLoja(LonglojaId,Stringnome){this.lojaId=lojaId;this.nome=nome;}publicLoja(Stringnome,intandar,Stringtelefone,Shoppingshopping){this.nome=nome;this.andar=andar;this.telefone=telefone;this.shoppingId=shopping;}publicLonggetLojaId(){returnlojaId;}publicvoidsetLojaId(LonglojaId){this.lojaId=lojaId;}publicStringgetNome(){returnnome;}publicvoidsetNome(Stringnome){this.nome=nome;}publicIntegergetAndar(){returnandar;}publicvoidsetAndar(Integerandar){this.andar=andar;}publicStringgetTelefone(){returntelefone;}publicvoidsetTelefone(Stringtelefone){this.telefone=telefone;}publicList<Produto>getProdutos(){returnprodutos;}publicvoidsetProdutos(List<Produto>produtos){this.produtos=produtos;}publicShoppinggetShoppingId(){returnshoppingId;}publicvoidsetShoppingId(ShoppingshoppingId){this.shoppingId=shoppingId;}publicvoidaddProduto(Produtoproduto){produtos.add(produto);}publicvoidremoverProduto(Produtoproduto){produtos.remove(produto);}@OverridepublicinthashCode(){inthash=0;hash+=(lojaId!=null?lojaId.hashCode():0);returnhash;}@Overridepublicbooleanequals(Objectobject){if(!(objectinstanceofLoja)){returnfalse;}Lojaother=(Loja)object;if((this.lojaId==null&&other.lojaId!=null)||(this.lojaId!=null&&!this.lojaId.equals(other.lojaId))){returnfalse;}returntrue;}@OverridepublicStringtoString(){return"Loja: "+getNome()+"; ID:"+this.getLojaId()+"; Telefone: "+getTelefone();}}
Eu consegui um workaround no método que persiste minha entidade, fazendo o Shopping referenciar a entidade loja ao mesmo tempo que a loja referencia o shopping, assim:
Não sei se é o jeito mais correto mas funcionou, se souber de algo melhor que eu possa fazer agradeço! valeu!
F
fbdo
Will, você está usando o EclipseLink com o JPA 2.0, certo? Você está fazendo o weaving das classes? Num projeto meu aqui, eu uso maven e faço weaving estático, pra funcionar eu adicionei no pom.xml:
<build><plugins><artifactId>maven-antrun-plugin</artifactId><executions><execution><phase>process-classes</phase><configuration><tasks><javaclassname="org.eclipse.persistence.tools.weaving.jpa.StaticWeave"classpathref="maven.runtime.classpath"fork="true"><argline="-loglevel FINE -persistenceinfo src/main/resources target/classes target/classes"/></java></tasks></configuration><goals><goal>run</goal></goals></execution></executions></plugin></plugins></build>