E agora! presciso que o hibernate nao exclua certos relacionamentos

7 respostas
M

Galera seguinte tenho o seguinte problema

tenho algumas classes

Pessoa
PessoaFisica
Associado

Funcionario

Um funcionario possue uma PessoaFisica que possue uma Pessoa

Um associado possue uma PessoaFisica que possue uma Pessoa

e um funcionario tambem pode ser um associado

quando isso acontece o o funcionario e associado compartilha das mesmas PessoaFisica e Pessoa

ou seja quando vou inserir um associado que ja e funcionario eu apenas seto a PessoaFisica e a Pessoa ja existente do funcionario

ate ai beleza o problema e nas exclusoes quando exclur um associado o hibernate deleta automaticamente a PessoaFisica e a Pessoa
e se exclui um funcionario ele deleta deleta automaticamente a PessoaFisica e a Pessoa

isso nao tem problema quando e apenas um associado ou um funcionario mais quando e um Associado que e funcionario gera problema pois a classe PessoaFisica e Pessoa do Associado e funcionario sao as mesma como eu faço para que caso um Associado seja um funcionario ele nao apaga a PessoaFisica nem a Pessoa ou vice versa pois um funcionario pode ser associado e deixar de ser funcionario.

Codigos.

Pessoa.java
@Entity
public class Pessoa {
	@Id
	@GeneratedValue
    private Long idPessoa;

}

}
PessoaFisica.java

@Entity
public class Pessoafisica {
	@Id
	@GeneratedValue
    private Long idPessoafisica;

 //Relacionamento com a classe pessoa
	@OneToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="id_pessoa",insertable=true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.ALL)
    private Pessoa pessoa;
}
Funcionario.java
@Entity
public class Funcionario {

	// Fields
	@Id
	@GeneratedValue
	private Long idFuncionario;

//Relacionamento com a classe juridica
	@OneToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="id_pessoafisica",insertable=true, updatable=true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.ALL)
}
Associado.java
@Entity
public class Associado{

	// Fields
	@Id
	@GeneratedValue
	private Long idAssociado;

//Relacionamento com a classe juridica
	@OneToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="id_pessoafisica",insertable=true, updatable=true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.ALL)
	private Pessoafisica Pessoafisica;
}
FuncionarioLogic.java
@Component("funcionario")
@InterceptedBy({/*AutorizadorInterceptor.class,*/DaoInterceptor.class})
//@InterceptedBy(DaoInterceptor.class)
public class FuncionarioLogic {

	private final DaoFactory daofactory;

	@In(scope=ScopeType.SESSION, required=false)
	@Out(scope=ScopeType.SESSION)
	private Funcionario funcionario;

	private List<Funcionario> funcionarios;
	
	@In(scope=ScopeType.SESSION, required=false)
	@Out(scope=ScopeType.SESSION)
	private Pessoafisica pessoafisica;
	private List<Pessoafisica> pessoafisicas;
	
	@In(scope=ScopeType.SESSION, required=false)
	@Out(scope=ScopeType.SESSION)
	private Pessoa pessoa;

@In(scope=ScopeType.SESSION, required=false, key="PESSOAS")
	@Out(scope=ScopeType.SESSION, key="PESSOAS")
	private List<Pessoa> pessoas;
// Metodo para formulario
	public void formulario() {
		novo();
	}
// Metodo para remover um Funcionario
	public void remove(Funcionario funcionario) {
		
		this.daofactory.beginTransaction();
		funcionario = this.daofactory.getFuncionarioDao().procura(funcionario.getIdFuncionario());
		this.daofactory.getFuncionarioDao().remove(funcionario);
		this.daofactory.commit();
	}

	// Getter para o endereço ser passado na sessão
	public Funcionario getFuncionario() {
		return funcionario;
	}
	
	// Getter para lista de endereços
	public List<Funcionario> getFuncionarios() {
		return funcionarios;
	}

	//Getter para o pessoajuridica ser passado na sessão
	public Pessoafisica getPessoafisica() {
		return pessoafisica;
	}
	//  Getter para lista de pessoajuridicas
	public List<Pessoafisica> getPessoafisicas() {
		return pessoafisicas;
	}

	//Getter para o pessoa ser passado na sessão
	public Pessoa getPessoa() {
		return pessoa;
	}

	//  Getter para lista de pessoa
	public List<Pessoa> getPessoas() {
		return pessoas;
	}
AssociadoLogic.java
@Component("associado")
@InterceptedBy({/*AutorizadorInterceptor.class,*/DaoInterceptor.class})
//@InterceptedBy(DaoInterceptor.class)
public class AssociadoLogic {

	private final DaoFactory daofactory;

	@In(scope=ScopeType.SESSION, required=false)
	@Out(scope=ScopeType.SESSION)
	private Associado associado;
	
@In(scope=ScopeType.SESSION, required=false, key="ASSOCIADOS")
	@Out(scope=ScopeType.SESSION, key="ASSOCIADOS")
	private List<Associado> associados;
	
	@In(scope=ScopeType.SESSION, required=false)
	@Out(scope=ScopeType.SESSION)
	private Pessoafisica pessoafisica;
	
	@In(scope=ScopeType.SESSION, required=false, key="PESSOAFISICAS")
	@Out(scope=ScopeType.SESSION, key="PESSOAFISICAS")
	private List<Pessoafisica> Pessoafisicas;
	
	@In(scope=ScopeType.SESSION, required=false)
	@Out(scope=ScopeType.SESSION)
	private Pessoa pessoa;

	@In(scope=ScopeType.SESSION, required=false, key="PESSOAS")
	@Out(scope=ScopeType.SESSION, key="PESSOAS")
	private List<Pessoa> pessoas;
	
	
	@In(scope=ScopeType.SESSION, required=false)
	@Out(scope=ScopeType.SESSION)
	private Funcionario funcionario;
	private List<Funcionario> funcionarios;
	
	public AssociadoLogic(DaoFactory daofactory) {
		this.daofactory = daofactory;
	}

// Metodo para formulario
	public void formulario(Associado associado) {
		this.indicado = this.daofactory.getAssociadoDao().procura(associado.getIdAssociado());
		
		if (this.associado != null) {
			this.associado = null;
		}
		
	}
// Metodo para remover um Pessoafisica
	public void remove(Associado associado) {
		
		this.daofactory.beginTransaction();
		associado = this.daofactory.getAssociadoDao().procura(associado.getIdAssociado());
		this.daofactory.getAssociadoDao().remove(associado);
		this.daofactory.commit();
	}
Dao.java
public class Dao<T> {

	private final Session session;
	@SuppressWarnings("unchecked")
	private final Class classe;

	@SuppressWarnings("unchecked")
	public Dao(Session session, Class classe) {
		this.session = session;
		this.classe  = classe;
	}
public void remove(T objeto) {
		this.session.delete(objeto);
	}
@SuppressWarnings("unchecked")
	public T procura(Long id) {
		return (T) session.load(this.classe, id);
	}
}

ai galera me ajudem ai devo mudar a extrutura e da pra resolver.

7 Respostas

lmprates

Utiliza esta anotação que você quiser evitar que os objetos filhos seja excluídos:

@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})

Referência:
http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/#entity-hibspec-cascade

M

entaum o caso e o seguinte so nao e para excluir os relacionamentos quando uma pessoa e um funcionario e tambem um associado caso contrario ele devera excluir normalmente a pessoafisica e a pessoa entendeu!!!

L

Então faz no braço… no método excluir() faz a verificação antes de excluir, se estiver relacionado, retorna uma msg se não exclui

M

então cara mais me diz ai o seguinte:

Se for um associado que não seja funcionário e só excluir o associado o pessoafisica e a pessoa, agora se for também um funcionário como faço no braço mesmo para que ele só exclua o associado… porque tenho que excluir o associado e manter a pessoafisica e o pessoa do funcionário.

então simplificando eu devo remover o cascade do associado e do funcionário e fazer os dois no braço, e quando for remover tenho que fazer uma verificação e depois excluir o que for necessário.

Ah e que eu to começando agora com o hibernate e imaginei que existisse um método que na hora de excluir vc apenas informava que o hibernate deveria ignorar o cascade. mais vlw então!!! E desculpa ai meu português

lmprates

Você deixa a anotação cascade que eu indiquei acima para ele nunca excluir, faz as suas verificações e exclui manualmente o pessoafisica quando for presciso.

L

Não entendi a frase… Sem ponto, vírgula, para mim ficou sem sentido…não entendi a idéia…

O que digo é vc não utilizar cascade nenhum… tipo…se vai excluir um associado… o hibernate vai excluir somente o associado, mas se vc tentar excluir uma pessoa, vai ter que percorrer toda a tabela de pessoafisica e excluir todas que referenciam a esta pessoa e percorrer todos os associados que referenciam a esta pessoa… antes de excluir a pessoa da tabela

M

!!!Correção!!!

então leopoldof e o seguinte:

Se for um associado que não seja funcionário e só excluir o associado o pessoafisica e a pessoa, agora se for também um funcionário como faço no braço mesmo para que ele só exclua o associado… porque tenho que excluir o associado e manter a pessoafisica e o pessoa do funcionário.

então simplificando eu devo remover o cascade do associado e do funcionário e fazer os dois no braço, e quando for remover tenho que fazer uma verificação e depois excluir o que for necessário.

Ah e que eu to começando agora com o hibernate e imaginei que existisse um método que na hora de excluir vc apenas informava que o hibernate deveria ignorar o cascade. mais vlw então!!! E desculpa ai meu português

Criado 10 de setembro de 2008
Ultima resposta 11 de set. de 2008
Respostas 7
Participantes 3