[Hibernate] Não consigo deletar

10 respostas
lucascaton

Boa noite galera do GUJ.

Venho mais uma vez solicitar ajuda sobre Hibernate.
O problema é que eu não consigo deletar um registro (objeto) da minha classe "Item".

Minha classe:
public class Item {

private Long idItem;
private String titulo;
private String subTitulo;
private String localizacao;
private TipoMaterial tipoMaterial;
private String editora;
private Date dataPublicacao;
private String edicao;
private Boolean script;
private Boolean acompanhadoDeAtividade;
private String dadosTecnicos;
private Classificacao classificacao;
private String sinopse;
private Idioma idioma;
private Status status;

private Set autores = new HashSet();
private Set capitulos = new HashSet();
private Set tagsItens = new HashSet();

//aqui vão: contrutor, setters e getters...
E o seu mapeamento:
<hibernate-mapping>

	<class name="model.Item" table="item">
	
            <id name="idItem">
            	<generator class="native"/>
	    </id>
	    
	    <property name="titulo" not-null="true"/>
	    <property name="subTitulo"/>
	    <property name="localizacao"/>
	    
	    <many-to-one class="model.TipoMaterial" name="tipoMaterial" column="idTipoMaterial" foreign-key="FK_idTipoMaterial" not-null="true"/>
	    
	    <set name="autores" table="Item_Autores">
			<key column="idItem"/>
			<many-to-many column="idAutor" class="model.Autor"/>
		</set>
		
	    <property name="editora"/>
	    <property name="dataPublicacao" type="timestamp" />
	    <property name="edicao"/>
	    <property name="script" type="yes_no"/>
	    <property name="acompanhadoDeAtividade" type="yes_no"/>
	    <property name="dadosTecnicos"/>
	    
	    <many-to-one class="model.Classificacao" name="classificacao" column="idClassificacao" foreign-key="FK_idClassificacao" not-null="true"/>
	    
	    <property name="sinopse"/>
	    
	    <many-to-one class="model.Idioma" name="idioma" column="idIdioma" foreign-key="FK_idIdioma" not-null="true"/>
	    <many-to-one class="model.Status" name="status" column="idStatus" foreign-key="FK_idStatus" not-null="true"/>
	    
		<set name="capitulos" table="capitulo" lazy="true" cascade="all-delete-orphan">
            	<key column="idItem" foreign-key="FK_idItem"/>
            	<one-to-many class="model.Capitulo"/>
		</set>
		
		<set name="tagsItens" table="Item_TagItens">
			<key column="idItem"/>
			<many-to-many column="idTagItem" class="model.TagItem"/>
		</set>
	
	</class>

</hibernate-mapping>
O problema ocorre quando eu tento deletar usando o código abaixo:
//Abre a sessão
Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
sessao.beginTransaction(); 

//Pega os parametros passados e armazena em objeto
ItemManager itemManager = new ItemManager();
Item currentItem = (Item) sessao.load(Item.class, (long) Long.parseLong(request.getParameter("idItem")));

//Deleta objeto
sessao.delete(currentItem);
sessao.getTransaction().commit();
HibernateUtil.getSessionFactory().close();
response.sendRedirect("../?pag=viewItem&mensagem=31");
O erro que aparece é:
exception

org.apache.jasper.JasperException: An exception occurred processing JSP page /includes/deleteItem.jsp at line 14

11:     
12: 	//Deleta objeto
13: 	sessao.delete(currentItem);
14: 	sessao.getTransaction().commit();
15: 	HibernateUtil.getSessionFactory().close();
16: 	response.sendRedirect("../?pag=viewItem&mensagem=31");
17: %>


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

root cause

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
(...)

root cause

java.sql.BatchUpdateException: Column 'idItem' cannot be null
(...)

Obrigado desde já.
Lucas Catón.

10 Respostas

fiaux

O que diz ali é que a coluna idItem não pode ser nula. Tem alguma tabela que aponta para item? Alguém se relaciona com item?

lucascaton

Tem sim. É uma classe chamada Capitulo.

O relacionamento é 1:N, ou seja, um Item possui vários Capitulos.

O seu mapeamento está assim:
<hibernate-mapping>

    <class name="model.Capitulo" table="capitulo">
        <id name="idCapitulo">
            <generator class="native"/>
        </id>
        <property name="indice"/>
        <property name="titulo"/>
        <many-to-one class="model.Item" name="item" column="idItem" foreign-key="FK_idItem" not-null="true"/>
    </class>

</hibernate-mapping>
Quando eu deletar um Item, eu preciso que todos os objetos Capitulos que sejam filhos de Item sejam deletados também.

Como devo fazer?

fiaux

Quando eu deletar um Item, eu preciso que todos os objetos Capitulos que sejam filhos de Item sejam deletados também.

Como devo fazer?


Ou configura o on delete cascade, ou você deleta um por um, antes de remover o Item.

lucascaton

Pois é, eu tentei colocar:

<set name="capitulos" table="capitulo" lazy="true" cascade="all-delete-orphan"> <key column="idItem" foreign-key="FK_idItem" on-delete="cascade"/> <one-to-many class="model.Capitulo"/> </set>

Mas aparece o seguinte erro:

lucascaton

Alguém pode me ajudar???

lucascaton

Por favor…

V

Olá pessoal, estou com essa mesma dúvida.
Alguem sabe a resposta?

g4j

Tente usar inverse=“true” assim:

<set name="capitulos" table="capitulo" lazy="true" cascade="all-delete-orphan" inverse="true">  
     <key column="idItem" foreign-key="FK_idItem" on-delete="cascade"/>  
     <one-to-many class="model.Capitulo"/>  
 </set>
lucascaton

Tentei o “inverse=true” Gerson, mas infelismente o erro continua:

lucascaton

Alguém?

Criado 9 de agosto de 2008
Ultima resposta 1 de out. de 2008
Respostas 10
Participantes 4