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.