Hibernate

1 resposta
S

Estou fazendo uma aplicação que usa Hibernate

O meu problema eh: tem uma entidade Categoria. uma categoria pode ter varios Produtos e um Produto pode pertencer a uma unica categoria. Isso gera um relacionamento um-pra-muitos entres essas duas entidades.

Cadastrei no banco uma Categoria e associei a ela um Produto. Agora quero deletar essa categoria.

No mapeamento do realacionamento coloquei o atributo cascade=“all”.
Isso deveria fazer com que quando eu fosse deletar a categoria os Produto associada seriam automaticamente deletados. Mas soh q isso nao esta acontecendo.
Uma excecao esta sendo levantada dizendo que nao pode deletar a Categoria pq ela esta sendo referencia pro um produto.

O mapeamento do Categoria eh o seguinte:
<hibernate-mapping>

<class name=“restaurante.categoria.Categoria” table=“categorias”>

<id name=“codigo” column=“cat_codigo” type=“long” unsaved-value=“null”>

<generator class=“sequence”>

<param name=“sequence”>cat_sequence</param>

</generator>
&lt;/id&gt;
&lt;property name="nome" column="cat_nome" type="string" length="15" not-null="true"/&gt;

</class>

</hibernate-mapping>

O mapeamento do Produto eh o seguinte:

<hibernate-mapping>

<class name=“restaurante.produto.Produto” table=“produtos”>

<id name=“codigo” column=“prd_codigo” type=“long” unsaved-value=“null”>

<generator class=“sequence”>

<param name=“sequence”>prd_sequence</param>

</generator>

</id>

<property name=“nome” column=“prd_nome” type=“string” length=“15” not-null=“true”/>

<property name=“unidade” column=“prd_unidade” type=“string” length=“15” not-null=“true”/>

<property name=“preco” column=“prd_preco” type=“double” not-null=“true”/>	

<property name=“disponibilidade” column=“prd_disponibilidade” type=“boolean” not-null=“true”/>	

<property name=“impressora” column=“prd_impressora” type=“string” not-null=“false”/>
&lt;many-to-one name="categoria" class="restaurante.categoria.Categoria" column="prd_cat_codigo" cascade="delete"/&gt;

</class>

</hibernate-mapping>

A excecao que tah dando eh a seguinte:

SEVERE: ERROR:  fkc42c109a52ac2cdf referential integrity violation - key in categorias still referenced from produtos

06/08/2004 10:44:59 net.sf.hibernate.JDBCException <init>

SEVERE: could not delete: [restaurante.categoria.Categoria#1]

java.sql.SQLException: ERROR:  fkc42c109a52ac2cdf referential integrity violation - key in categorias still referenced from produtos

at org.postgresql.core.QueryExecutor.executeV2(QueryExecutor.java:289)

at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:105)

at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:43)

at org.postgresql.jdbc1.AbstractJdbc1Statement.execute(AbstractJdbc1Statement.java:515)

at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:50)

at org.postgresql.jdbc1.AbstractJdbc1Statement.executeUpdate(AbstractJdbc1Statement.java:271)

at net.sf.hibernate.impl.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:22)

at net.sf.hibernate.persister.EntityPersister.delete(EntityPersister.java:598)

at net.sf.hibernate.impl.ScheduledDeletion.execute(ScheduledDeletion.java:29)

at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2382)

at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2340)

at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2204)

at restaurante.persistencia.BaseDAO.removeObj(BaseDAO.java:34)

at restaurante.categoria.CategoriaDAO.removerCategoria(CategoriaDAO.java:64)

at restaurante.categoria.CategoriaDAO.main(CategoriaDAO.java:91)

06/08/2004 10:44:59 net.sf.hibernate.impl.SessionImpl execute

SEVERE: Could not synchronize database state with session

Se alguem souber o q eu estou fazendo de errado e poder me ajuda, agradeço :slight_smile:

1 Resposta

S

Oi,

“Silvana”:
Estou fazendo uma aplicação que usa Hibernate

No mapeamento do realacionamento coloquei o atributo cascade=“all”.
Isso deveria fazer com que quando eu fosse deletar a categoria os Produto associada seriam automaticamente deletados. Mas soh q isso nao esta acontecendo.


não conheço Hibernate (ainda) mas, da parte de banco de dados, temos tradicionalmente duas cláusulas CASCADE: ON UPDATE e ON DELETE, e o padrão é false, ou seja, precisa declarar para ativar.

É só um palpite, já que não faço a menor idéia de como esse tal hibernate (que pelo que sei é só um pattern ou algo assim para facilitar as coisas no sql) implementa este tipo de detalhe.

Criado 6 de agosto de 2004
Ultima resposta 8 de ago. de 2004
Respostas 1
Participantes 2