Divida com cascade e na exclusao e no cadastro +Urgente+Hibernate+Vraptor

2 respostas
M

Galera seguinte to com uma grande duvida primeiro seguinte eu tenho 3 classes relacionadas

Pessoa
PessoaJuridica
Credenciado

seguinte

Pessoa Juridica esta relacionado um para um com Pessoa Juridica

e o Credenciado esta relacionado de um para um com Credenciado

e para fazer o cadastro de credenciados eu utilizo um unico form que grava em tres tabelas esta funcionando mais nao sei se estou fazendo da melhor forma ou se terei problemas com isso.

vou postar os codigos

@Entity
public class Pessoa {
	@Id
	@GeneratedValue
    private Long idPessoa;
//sets e getters
}
@Entity
public class Pessoajuridica {

	// Fields
	@Id
	@GeneratedValue
	private Long idPessoajuridica;

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

	// Fields
	@Id
	@GeneratedValue
	private Long idCredenciado;

//Relacionamento com a classe pessoa
	@OneToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="id_pessoajuridica",insertable=true, updatable=true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.ALL)
	private Pessoajuridica pessoajuridica;

//sets and getters
}
@Component("credenciado")
@InterceptedBy({/*AutorizadorInterceptor.class,*/DaoInterceptor.class})
//@InterceptedBy(DaoInterceptor.class)
public class CredenciadoLogic {

	private final DaoFactory daofactory;

	@In(scope=ScopeType.SESSION, required=false)
	@Out(scope=ScopeType.SESSION)
	private Credenciado credenciado;

	private List<Credenciado> credenciados;
	
	@In(scope=ScopeType.SESSION, required=false)
	@Out(scope=ScopeType.SESSION)
	private Pessoajuridica pessoajuridica;
	private List<Pessoajuridica> pessoajuridicas;
	
	@In(scope=ScopeType.SESSION, required=false)
	@Out(scope=ScopeType.SESSION)
	private Pessoa pessoa;

	private List<Pessoa> pessoas;

	public CredenciadoLogic(DaoFactory daofactory) {
		this.daofactory = daofactory;
	}
// Metodo para formulario
	public void formulario() {

	}
// Metodo para gravar um Credenciado/PessoaJuridica/Pessoa
	public void armazena(Credenciado credenciado, Pessoajuridica pessoajuridica, Pessoa pessoa) {
		Calendar calendar = new GregorianCalendar();
		Date hoje = new Date();
		pessoa.setDtcadastro(hoje);
		this.daofactory.beginTransaction();
		this.daofactory.getPessoaDao().adiciona(pessoa);
		this.pessoa = daofactory.getPessoaDao().procura(pessoa.getIdPessoa());
		pessoajuridica.setPessoa(this.pessoa);
		this.daofactory.getPessoajuridicaDao().adiciona(pessoajuridica);
		this.pessoajuridica = daofactory.getPessoajuridicaDao().procura(pessoajuridica.getIdPessoajuridica());
		credenciado.setPessoajuridica(this.pessoajuridica);
		this.daofactory.getCredenciadoDao().adiciona(credenciado);
		
		this.daofactory.getPessoaDao().atualiza(pessoa);
		this.daofactory.getPessoajuridicaDao().atualiza(pessoajuridica);
		this.daofactory.getCredenciadoDao().adiciona(credenciado);
		this.daofactory.commit();
		
		if (this.pessoa != null) {
			this.pessoa = null;		
		}
		if (this.pessoajuridica != null) {
			this.pessoajuridica = null;		
		}
		if (this.credenciado != null) {
			this.credenciado = null;		
		}
}
<form name="fcadcred" action="credenciado.armazena.logic">
<center><table style=table style="width: 784px;">
<tr>
 	<td>
<h3></h3>
    <ul id="errors" >
 	<c:forEach var="error" items="${errors.iterator}">
 		<li>${error.key}</li>
 	</c:forEach>
    </ul>
    </td>
 	</tr> 	
</table></center>
<center><table style=table style="width: 784px;">
	
		<input type="hidden" name="pessoa.idPessoa" style="width: 46px" readonly="readonly" value="${pessoa.idPessoa}">
		<input type="hidden" name="pessoajuridica.idPessoajuridica" style="width: 46px" readonly="readonly" value="${pessoajuridica.idPessoajuridica}">
		<input type="hidden" name="credenciado.idCredenciado" value="${credenciado.idCredenciado}" style="width: 76px" readonly="readonly">

	<tr><td colspan="2" align=center>Credenciado</td></tr>	
	<tr>
		<td width="150" align=right>Nome Fantasia</td>
		<td ><input type="text"
			name="pessoajuridica.nomeFantasia" value="${pessoajuridica.nomeFantasia}" width="250"
			style="width: 210px"></td>
	</tr>
	<tr>
		<td width="150" align=right>Razao Social</td>
		<td >
		<input type="text" name="pessoajuridica.razaoSocial" 
		value="${pessoajuridica.razaoSocial}" ></td>
   </tr>
   <tr>
		<td width="150" align=right>CNPJ</td>
		<td><input type="text" name="pessoajuridica.cnpj"
			value="${pessoajuridica.cnpj}"></td>
     </tr>
     <tr>
		<td width="150" align=right>Inscrição Estatual</td>
		<td><input type="text" name="pessoajuridica.inscEstatual"
			value="${pessoajuridica.inscEstatual}"></td>
     </tr>
     <tr>
		<td width="150" align=right>Observa;'ao</td>
		<td><input type="text" name="pessoa.observacao"
			value="${pessoa.observacao}"></td>
     </tr>
 	
	<tr>
		<td width="150" align=right>Seguimento</td>
		<td ><input type="text"
			name="credenciado.seguimento" value="${credenciado.seguimento}" width="250"
			style="width: 210px"></td>
	</tr>
	<tr>
		<td width="150" align=right>descrição</td>
		<td >
		<input type="text" name="credenciado.descricao" 
		value="${credenciado.descricao}" ></td>
   </tr>
   <tr>
		<td width="150" align=right>Proprietario</td>
		<td><input type="text" name="credenciado.proprietario"
			value="${credenciado.proprietario}"></td>
     </tr>
     <tr>
		<td width="150" align=right>Banco</td>
		<td><input type="text" name="credenciado.banco"
			value="${credenciado.banco}"></td>
     </tr>
     <tr>
		<td width="150" align=right>Agencia</td>
		<td><input type="text" name="credenciado.agencia"
			value="${credenciado.agencia}"></td>
     </tr>
     <tr>
		<td width="150" align=right>Conta</td>
		<td><input type="text" name="credenciado.conta"
			value="${credenciado.conta}"></td>
     </tr>
     <tr>
		<td width="150" align=right>titular</td>
		<td><input type="text" name="credenciado.titular"
			value="${credenciado.titular}"></td>
     </tr>
     <tr>
		<td width="150" align=right>Percentual</td>
		<td><input type="text" name="credenciado.percentual"
			value="${credenciado.percentual}"></td>
     </tr>
     <tr>
		<td width="150" align=right>Tipo</td>
		<td><input type="text" name="credenciado.tipo"
			value="${credenciado.tipo}"></td>
     </tr>
</table></center>
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 adiciona(T objeto) {
		this.session.save(objeto);
	}

	public void remove(T objeto) {
		this.session.delete(objeto);
	}

	public void atualiza(T objeto){
		this.session.merge(objeto);
	}
}

Daofactory

public class DaoFactory {

	private final Session session;
	private Transaction transaction;

	public DaoFactory() {
		session = HibernateUtil.getSession();
	}

//	Metodo obrigatório para classe PessoaLogic retorna a pessoa para edição	
	public Dao<Pessoa> getPessoaDao(){
		return new Dao<Pessoa>(this.session, Pessoa.class);
	}
// Metodo obrigatório para classe Pessoajuridica (pessoa)  	
	public Dao<Pessoajuridica> getPessoajuridicaDao(){
		return new Dao<Pessoajuridica>(this.session, Pessoajuridica.class);
	}
	//Metodo obrigatório para classe Credenciado (pessoajuridica)  	
	public Dao<Credenciado> getCredenciadoDao(){
		return new Dao<Credenciado>(this.session, Credenciado.class);
	}
public void beginTransaction() {
		this.transaction = this.session.beginTransaction();
	}

	public void commit() {
		this.transaction.commit();
		this.transaction = null;
	}

	public boolean hasTransaction() {
		return this.transaction != null;
	}

	public void rollback() {
		this.transaction.rollback();
		this.transaction = null;
	}

	public void close() {
		this.session.close();
	}
}

acho que nao e por ai ne galera ajudai tipo vc vem que eu tenho que setar como null no final do armazena se nao ele fica na memoria acho que se diz dethached… se ao inves de usar adicionar(save) no lugar de atualiza(merge) ele nao consegue pegar o id adicionado para setar para a proxima classe so consegui assim acho que ficou uma ganbiarra ne

e outra coisa como foca para excluir com esse tipo de relacionamento pois o meu aqui nao ta funcionando vlw

2 Respostas

M

quando tento exclui da o seguinte erro

org.vraptor.LogicException: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [br.com.bolsocard.modelo.Credenciado#1]
	at org.vraptor.component.DefaultLogicMethod.execute(DefaultLogicMethod.java:68)
	at org.vraptor.interceptor.ExecuteLogicInterceptor.intercept(ExecuteLogicInterceptor.java:32)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at org.vraptor.interceptor.SettingAndValidationInterceptor.intercept(SettingAndValidationInterceptor.java:131)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at org.vraptor.interceptor.InjectionInterceptor.intercept(InjectionInterceptor.java:41)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at org.vraptor.interceptor.ComponentLookupInterceptor.intercept(ComponentLookupInterceptor.java:58)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at br.com.bolsocard.main.DaoInterceptor.intercept(DaoInterceptor.java:16)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at org.vraptor.interceptor.FlashScopeInterceptor.intercept(FlashScopeInterceptor.java:22)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at org.vraptor.interceptor.RegisterAttributesInteceptor.intercept(RegisterAttributesInteceptor.java:38)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at org.vraptor.core.VRaptorExecution.execute(VRaptorExecution.java:98)
	at org.vraptor.core.DefaultController.execute(DefaultController.java:46)
	at org.vraptor.VRaptorServlet.service(VRaptorServlet.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Unknown Source)
Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [br.com.bolsocard.modelo.Credenciado#1]
	at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:556)
	at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:88)
	at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:49)
	at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:766)
	at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:744)
	at br.com.bolsocard.dao.Dao.remove(Dao.java:30)
	at br.com.bolsocard.logic.CredenciadoLogic.remove(CredenciadoLogic.java:138)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.vraptor.component.DefaultLogicMethod.execute(DefaultLogicMethod.java:61)
	... 32 more
M

galera ja resolvi e por que eu esta repetindo uma consulta que o hibernate ja fazia automaticamente e ele estava me ajudando a corrigir minhas falhas legal ne!!!

Mais e a forma de cadastrar estou fazendo dentro dos padroes!!!

Criado 28 de agosto de 2008
Ultima resposta 28 de ago. de 2008
Respostas 2
Participantes 1