Problema com relacionamento entre classes

6 respostas
Kleber-rr

olá pessoal, td bem??
Estou com um problema no mínimo estranho pra mim... mas vamos lá:

até semana passada, eu fazia o relacionamento nas classes dessa forma:

@Entity
@Table(name = "estados")
public class Estado implements Serializable {

	private static final long serialVersionUID = -5582648910303813488L;

	@Id
	@GeneratedValue
	private Long id;
	private String sigla;
	private String nome;
	private cidade_id_cidade;
	private cliente_id_cliente;
	private empresa_id_empresa;

aí, segundo recomendações e explicações dos colegas eu corrigi e estou usando assim:

@Entity
@Table(name = "estados")
public class Estado implements Serializable {

	private static final long serialVersionUID = -5582648910303813488L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "ESTADO_ID")
	private Long id;

	@Column(name = "sigla")
	private String sigla;

	@Column(name = "nome")
	private String nome;

	@OneToMany(mappedBy = "estado", fetch = FetchType.LAZY)
	@Cascade(org.hibernate.annotations.CascadeType.ALL)
	private List<Cidade> cidades = new ArrayList<Cidade>();

	@OneToMany(mappedBy = "estado", fetch = FetchType.LAZY)
	@Cascade(org.hibernate.annotations.CascadeType.ALL)
	private List<Cliente> clientes = new ArrayList<Cliente>();

	@OneToMany(mappedBy = "estado", fetch = FetchType.LAZY)
	@Cascade(org.hibernate.annotations.CascadeType.ALL)
	private List<Empresa> empresas = new ArrayList<Empresa>();

O problema é que agora, se eu mando excluir um registro, ele faz um efeito dominó e sai apagando tudo que se relaciona com ele.

Antes isso não acontecia, então me leva a crer que o problema seja meu relacionamento... mas por vi das dúvidas, vou postar o código da exclusão no bean e na pagina.

public String excluir(ActionEvent event) {
		System.out.println("Excluindo: " + cliente.getId());
		UIComponent link = event.getComponent();
		UIParameter param = (UIParameter) link.findComponent("excluir");
		Long id = (Long) param.getValue();

		Session session = HibernateUtil.currentSession();
		Dao<Cliente> clienteDao = new Dao<Cliente>(session, Cliente.class);
		this.cliente = clienteDao.load(id);
		clienteDao.delete(this.cliente);
		this.cliente = new Cliente();
		return "excluido";

	}
<h:column>
			<f:facet name="header">
				<h:outputText value="Excluir"/>
			</f:facet>
			<h:commandButton value="Excluir" actionListener="#{clienteBean.excluir}" />
				<f:param id="excluir" name="id" value="#{f.id}"/>
		</h:column>

Se alguem souber o q pode ser, agradeço. Se precisar de mais detalhes é só pedir.

Flws

6 Respostas

thiagocg

Olá Kleber-rr, já tentou retirar a anotação cascade do do seu mapeamento?

Faça um teste sem esta linha nos seus mapeamentos de relacionento:

@Cascade(org.hibernate.annotations.CascadeType.ALL)

[]'s

Kleber-rr

thiagocg:
Olá Kleber-rr, já tentou retirar a anotação cascade do do seu mapeamento?

Faça um teste sem esta linha nos seus mapeamentos de relacionento:

@Cascade(org.hibernate.annotations.CascadeType.ALL)

[]'s

O que essa linha significa??

Kleber-rr

Tiagão, valeu man!! Resolveu mesmo.

thiagocg

Opções de cascata são declaradas para que possam aplicar determinadas regras sobre os objetos associados a sua classe anotada, por exemplo o seu mapeamento de cidade:

@OneToMany(mappedBy = "estado", fetch = FetchType.LAZY) @Cascade(org.hibernate.annotations.CascadeType.ALL) private List<Cidade> cidades = new ArrayList<Cidade>();
Como vc está aplicando o modelo de cascata CascadeType.ALL o hibernate aplica sobre os objetos associados a estado todos os tipos de cascata definidos na documentação e entre eles o CascadeType.delete-orphan, que habilita a deleção de objetos associados quando eles são removidos da associação, no caso excluindo um estado a cidade que estava relacionada aquele estado tb é removida.

Espero ter ajudado!

[]'s

thiagocg

Aqui um link para a documentação do hibernate caso vc queira conhecer um pouquinho mais sobre cascade:

http://docs.jboss.org/hibernate/stable/core/reference/en/html/

De uma olhada nos itens:
21.3. Cascading life cycle
21.4. Cascades and unsaved-value

[]'s

Kleber-rr

thiagocg:
Aqui um link para a documentação do hibernate caso vc queira conhecer um pouquinho mais sobre cascade:

http://docs.jboss.org/hibernate/stable/core/reference/en/html/

De uma olhada nos itens:
21.3. Cascading life cycle
21.4. Cascades and unsaved-value

[]'s


ô tiagão, valeu man!! to precisando mesmo.

ótima semana.

Criado 31 de janeiro de 2010
Ultima resposta 1 de fev. de 2010
Respostas 6
Participantes 2