HIbernate não remove entidade;

Java

11/09/2014

tenho duas entidade uma cliente

@Entity
@Table
@XmlRootElement
public class Cliente implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(nullable = false)
@SwingColumn(description = "Codígo")
private Integer idcliente;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 100)
@Column(nullable = false, length = 100)
@SwingColumn(description = "Cliente")
private String cliente;

......

uma outra conjuge

@Entity
@Table
public class Conjuge implements Serializable {

private static final long serialVersionUID = 2L;
@Id
@NotNull
@Valid
@OneToOne
private Cliente cliente;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 50)
@Column(nullable = false, length = 50)
private String conjuge;

quando crio um cliente e digo que esse cliente é casado e o mesmo tem um conjuge o hibernate faz a persistência normal, porem quando eu altero o cliente e informo que ele é solteiro e mando o hibernate deleta o conjuge ele faz o comit porem não deleta, mas quando delete o cliente ele realmente deleta o cliente e também o conjuge, ou seja, so não consigo dele apenas o conjuge segue a baixo a classe do meu dao.

protected boolean removeEntity(Object entity) {

try {
iniciarTransacao();
getEm().remove(entity);
commitTransacao();
UtilMensagens.mensagemInformacao("Transação realizada com Sucesso!");
return true;
} catch (Exception e) {
rollbackTransacao();
UtilMensagens.mensagemErro("Transação não realizada erro \n: "
+ UtilErros.getMensagemErro(e));
return false;
}
}

protected EntityManager getEm() {
return em = EntityManagerUtil.getEntityManager();
}

public void iniciarTransacao() {
if (getEm().getTransaction().isActive() == false) {
em.getTransaction().begin();
}
}

public void rollbackTransacao() {
iniciarTransacao();
getEm().getTransaction().rollback();
}

public void commitTransacao() {
iniciarTransacao();
getEm().getTransaction().commit();
}
John Lima

John Lima

Curtidas 0

Respostas

Ronaldo Lanhellas

Ronaldo Lanhellas

11/09/2014

Aparece algum erro ao tentar deletar o Conjuge ? Se sim, poste aqui. Da uma olhada no seu mapeamento acho que está meio confuso esse @OneToOne, além do que penso que um Cliente tem um Conjuge mas um Conjuge também pode ser um Cliente, sendo assim não sei se faz sentido ter uma classe chamada Conjuge.
GOSTEI 0
John Lima

John Lima

11/09/2014

Entendo eu criei uma classe conjuge, para não deixa campos em branco na tabela cliente, seguindo sua linha de raciocínio eu teria um alto relacionamento na tabela cliente ? e sobre o hibernate apresenta erro creio que não pois o metodo remover retorna true quando faz o commit e false quando faz roolback.
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

11/09/2014

Sim meu caro, você faria uma auto-relacionamento de cliente para cliente. Acho que torna mais fácil o seu trabalho, tente fazer isso.
GOSTEI 0
John Lima

John Lima

11/09/2014

e como ficaria ?
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

11/09/2014

Tente assim:

@Entity
@Table
@XmlRootElement
public class Cliente implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(nullable = false)
@SwingColumn(description = "Codígo")
private Integer idcliente;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 100)
@Column(nullable = false, length = 100)
@SwingColumn(description = "Cliente")
private String cliente;

//Suas anotações aqui (seria one-to-one)
private Cliente conjuge;
GOSTEI 0
John Lima

John Lima

11/09/2014

uma duvida como vou te um atributo cônjuge do tipo Cliente ou seja vou ter todos os dados do cliente inclusive o atributo cônjuge, quando fui seta as variarei setei todas menos o id e o próprio atributo conjuge
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

11/09/2014

O conjuge deve ser um atributo "One-to-One", com Cascade Persiste,Update. Sua lógica está certa, setando todos os atributos no cliente menos o id e colocando o objeto conjuge que na verdade é outro cliente (que pode ou não estar cadastrado).
GOSTEI 0
John Lima

John Lima

11/09/2014

quando eu persisto o cliente com o conjuge null ele commit a transação agora quando eu persisto com o objeto cônjuge setado ele me apresenta um erro :

xception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at org.hibernate.type.descriptor.java.AbstractTypeDescriptor.extractHashCode(AbstractTypeDescriptor.java:88)
at org.hibernate.type.AbstractStandardBasicType.getHashCode(AbstractStandardBasicType.java:210)
at org.hibernate.type.AbstractStandardBasicType.getHashCode(AbstractStandardBasicType.java:214)
at org.hibernate.type.EntityType.getHashCode(EntityType.java:381)
at org.hibernate.type.ComponentType.getHashCode(ComponentType.java:263)
at org.hibernate.engine.spi.EntityKey.generateHashCode(EntityKey.java:114)
at org.hibernate.engine.spi.EntityKey.<init>(EntityKey.java:79)
at org.hibernate.internal.AbstractSessionImpl.generateEntityKey(AbstractSessionImpl.java:247)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:172)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:135)
at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:78)
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:843)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:836)
at org.hibernate.ejb.engine.spi.EJB3CascadingAction$1.cascade(EJB3CascadingAction.java:53)
at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:388)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:331)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:209)
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:166)
at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:449)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:292)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:78)
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:843)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:836)
at org.hibernate.ejb.engine.spi.EJB3CascadingAction$1.cascade(EJB3CascadingAction.java:53)
at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:388)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:331)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:209)
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:166)
at org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:424)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:263)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:78)
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:853)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:827)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:831)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:875)
at com.br.emobeli.modelo.GenericoDao.addEntity(GenericoDao.java:56)
at com.br.emobeli.modelo.ClienteDao.incluir(ClienteDao.java:31)
at com.br.emobeli.controle.ClienteControle.incluir(ClienteControle.java:28)
at com.br.emobeli.view.Menu.imovel(Menu.java:656)
at com.br.emobeli.view.Menu.jButton1ActionPerformed(Menu.java:460)
at com.br.emobeli.view.Menu.access$000(Menu.java:43)
at com.br.emobeli.view.Menu$1.actionPerformed(Menu.java:135)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6516)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
at java.awt.Component.processEvent(Component.java:6281)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4872)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4698)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4698)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

11/09/2014

Coloca a sua propriedade conjuge como CASCADE.PERSISTE não esqueça.
GOSTEI 0
John Lima

John Lima

11/09/2014

eu coloquei como cascade all, afinal posso altera, incluir como também posso depois dizer que o cliente era solteiro e ter que remover os dados
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

11/09/2014

Tenta colocar ManyToOne e veja se funciona. E poste seu mapeamento alterado aqui.
GOSTEI 0
POSTAR