Erro ao inserir Hibernate/JPA

4 respostas
F

Bom dia!

Tenho uma aplicação com JSF, Spring e Hibernate/JPA…Não estou conseguindo achar o erro que me impede de inserir na tabela, o erro é esse:

29/04/2011 14:47:58 com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback visit
SEVERE: javax.el.ELException: /criar.xhtml @27,59 flowListener="#{criarBean.prepararEtapas}": org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction

Vou postar a classe que estou tentando persistir, assim como o metodo do meu Dao…qualquer coisa só falar que posto mais.

package model;

import java.io.Serializable;

import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.NotEmpty;

@Entity
public class MoradiaProd implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private Long id;
	private int totalpessoas;
	private int numComados;
	private int numQuartos;
	private double metragem;
	private int idade;
	private String telefone;
	private PessoasFamilia familia;
	private PessoasEmpregado empregado;
	private Piso piso;
	private Cobertura cobertura;
	private Material material;
	private AguaCap aguaCaptacao;
	private AguaCan aguaCanalizada;
	private AguaCons aguaConsumo;
	private AguaDest aguaDestino;
	private LocalLavRoupa localLavRoupa;
	private InstalSan instalacaoSanitaria;
	private BensDeConsumo bensDeConsumo;
	private Municipio municipio;
	private String rua;
	private String bairro;
	private String cep;
	private int num;
	private boolean cidade;
	private boolean campo;

	public MoradiaProd() {
		// TODO Auto-generated constructor stub
	}

	@Id
	@SequenceGenerator(name = "seq", sequenceName = "moradiaprod_seq", allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public int getTotalpessoas() {
		return totalpessoas;
	}

	public void setTotalpessoas(int totalpessoas) {
		this.totalpessoas = totalpessoas;
	}

	public int getNumComados() {
		return numComados;
	}

	public void setNumComados(int numComados) {
		this.numComados = numComados;
	}

	public int getNumQuartos() {
		return numQuartos;
	}

	public void setNumQuartos(int numQuartos) {
		this.numQuartos = numQuartos;
	}

	public double getMetragem() {
		return metragem;
	}

	public void setMetragem(double metragem) {
		this.metragem = metragem;
	}

	public int getIdade() {
		return idade;
	}

	public void setIdade(int idade) {
		this.idade = idade;
	}

	@NotEmpty(message = "{telefone}")
	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	@Embedded
	public PessoasFamilia getFamilia() {
		return familia;
	}

	public void setFamilia(PessoasFamilia familia) {
		this.familia = familia;
	}

	@Embedded
	public PessoasEmpregado getEmpregado() {
		return empregado;
	}

	public void setEmpregado(PessoasEmpregado empregado) {
		this.empregado = empregado;
	}

	@NotNull(message = "{piso}")
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_piso", nullable = false)
	public Piso getPiso() {
		return piso;
	}

	public void setPiso(Piso piso) {
		this.piso = piso;
	}

	@NotNull(message = "{cobertura}")
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_cobertura", nullable = false)
	public Cobertura getCobertura() {
		return cobertura;
	}

	public void setCobertura(Cobertura cobertura) {
		this.cobertura = cobertura;
	}

	@NotNull(message = "{material}")
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_material", nullable = false)
	public Material getMaterial() {
		return material;
	}

	public void setMaterial(Material material) {
		this.material = material;
	}

	@NotNull(message = "{captacao}")
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_aguacap", nullable = false)
	public AguaCap getAguaCaptacao() {
		return aguaCaptacao;
	}

	public void setAguaCaptacao(AguaCap aguaCaptacao) {
		this.aguaCaptacao = aguaCaptacao;
	}

	@NotNull(message = "{canalizada}")
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_aguacan", nullable = false)
	public AguaCan getAguaCanalizada() {
		return aguaCanalizada;
	}

	public void setAguaCanalizada(AguaCan aguaCanalizada) {
		this.aguaCanalizada = aguaCanalizada;
	}

	@NotNull(message = "{consumo}")
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_aguacons", nullable = false)
	public AguaCons getAguaConsumo() {
		return aguaConsumo;
	}

	public void setAguaConsumo(AguaCons aguaConsumo) {
		this.aguaConsumo = aguaConsumo;
	}

	@NotNull(message = "{destino}")
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_aguadest", nullable = false)
	public AguaDest getAguaDestino() {
		return aguaDestino;
	}

	public void setAguaDestino(AguaDest aguaDestino) {
		this.aguaDestino = aguaDestino;
	}

	@NotNull(message = "{local}")
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_locallavroupa", nullable = false)
	public LocalLavRoupa getLocalLavRoupa() {
		return localLavRoupa;
	}

	public void setLocalLavRoupa(LocalLavRoupa localLavRoupa) {
		this.localLavRoupa = localLavRoupa;
	}

	@NotNull(message = "{instalacao}")
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_instalsan", nullable = false)
	public InstalSan getInstalacaoSanitaria() {
		return instalacaoSanitaria;
	}

	public void setInstalacaoSanitaria(InstalSan instalacaoSanitaria) {
		this.instalacaoSanitaria = instalacaoSanitaria;
	}

	@Embedded
	public BensDeConsumo getBensDeConsumo() {
		return bensDeConsumo;
	}

	public void setBensDeConsumo(BensDeConsumo bensDeConsumo) {
		this.bensDeConsumo = bensDeConsumo;
	}

	@NotNull(message = "{municipio}")
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_municipio", nullable = false)
	public Municipio getMunicipio() {
		return municipio;
	}

	public void setMunicipio(Municipio municipio) {
		this.municipio = municipio;
	}

	@NotEmpty(message = "{rua}")
	public String getRua() {
		return rua;
	}

	public void setRua(String rua) {
		this.rua = rua;
	}

	@NotEmpty(message = "{bairro}")
	public String getBairro() {
		return bairro;
	}

	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	@NotEmpty(message = "{cep}")
	public String getCep() {
		return cep;
	}

	public void setCep(String cep) {
		this.cep = cep;
	}

	@NotEmpty(message = "{num}")
	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public boolean isCidade() {
		return cidade;
	}

	public void setCidade(boolean cidade) {
		this.cidade = cidade;
	}

	public boolean isCampo() {
		return campo;
	}

	public void setCampo(boolean campo) {
		this.campo = campo;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		MoradiaProd other = (MoradiaProd) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "MoradiaProd [id=" + id + "]";
	}
	
	

}
package dao.impl;

import java.io.Serializable;
import java.util.List;
import java.lang.reflect.ParameterizedType;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import dao.Dao;

@Repository
public abstract class DaoImpl<T, ID extends Serializable> implements
		Dao<T, ID> {

	private Class<T> persistentClass;

	@PersistenceContext
	protected EntityManager entityManager;

	@SuppressWarnings("unchecked")
	public DaoImpl() {
		this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
				.getGenericSuperclass()).getActualTypeArguments()[0];
	}

	public Class<T> getPersistentClass() {
		return persistentClass;
	}

	@Transactional(readOnly = true)
	public T loadById(ID id) {
		return entityManager.find(persistentClass, id);
	}

	@Transactional
	public void persist(T entity) {
		entityManager.persist(entity);
	}

	@Transactional
	public void update(T entity) {
		entityManager.merge(entity);
	}

	@Transactional
	public void delete(T entity) {
		Object o = entityManager.merge(entity);
		entityManager.remove(o);
	}

	@Transactional(readOnly = true)
	@SuppressWarnings("unchecked")
	public List<T> loadAll() {
		return entityManager.createQuery(
				"Select t from " + persistentClass.getSimpleName() + " t")
				.getResultList();
	}

}

Aqui é como eu faço pra inserir no Meu Bean do JSF…

.......................

/**
	 * MORADIA PRODUTOR
	 */
	private MoradiaProdDao moradiaProdDao;
	
	@Resource
	public void setMoradiaProdDao(MoradiaProdDao moradiaProdDao){
		this.moradiaProdDao = moradiaProdDao;
	}
	
	private void salvar(){
		
		this.moradiaProdDao.persist(this.produtor.getMoradiaProdutor());
		
	}
...................

Obrigado.
Filipe.

4 Respostas

F

Pessoal ainda não consegui…

Alguem que usa JSF e Hibernate poderia por favor me dizer se pra salvar e fazer operações CRUD faz da maneira que eu fiz mesmo?

Chamando os metodos CRUD do DAO no Bean? Ou é necessário abrir outra transação?

Exemplo como eu faço:

....
private void salvar(){  
           
    this.moradiaProdDao.persist(this.produtor.getMoradiaProdutor());  
           
} 
...

Viu eu chamo o metodo do DAO no bean…

Nossa é que não está funcionando…não sei pq…

Obrigado,
Filipe.

D

poste o resto do stacktrace pra ter uma melhor noção do erro.

F

Rapaz não tem resto não…é só isso mesmo :cry:

Obrigado.

F

Bom dia a todos!

Eu consegui resolver uma parte desse problema, eu estava colocando o length menor do que tinha que ser.

Mas agora estou com outro erro:

org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: model.TAgri; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: model.TAgri

Queria saber se alguem sabe como resolver isso, vou postar os pedaços referentes ao erro.

Classe Produtor:

    //@NotEmpty(message="{agri}")
    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name = "prod_agri", joinColumns = { @JoinColumn(name = "id_produtor") }, inverseJoinColumns = { @JoinColumn(name = "id_agri") })
    public Set<TAgri> getAgricultores() {
        return agricultores;
    }

    public void setAgricultores(Set<TAgri> agricultores) {
        this.agricultores = agricultores;
    }

    public void addAgricultor(TAgri agricultor) { // - Não estou usando isso aqui...deveria usar?
        if (agricultor != null) {
            this.getAgricultores().add(agricultor);
            agricultor.getProdutores().add(this);
        }
    }
Classe TAgri:

   public void setProdutores(Set<Produtor> produtores) {
        this.produtores = produtores;
    }

    @ManyToMany(mappedBy = "agricultores", fetch = FetchType.LAZY)
    public Set<Produtor> getProdutores() {
        return produtores;
    }
Meu bean, pra salvar faço assim:

   this.produtorDao.persist(this.produtor);
O Dao esta assim:

    @Transactional
    public void persist(T entity) {
        entityManager.persist(entity);
    }
Na view está assim:

                               p:outputPanel id="pAgri">
                                        <h:panelGroup rendered="#{criarBean.produtor.associadoAgricultores}">
                                            <!--  <h:outputText value="#{msgs.criarPAgriQ}: "/> -->
                                            <h:selectManyCheckbox value="#{criarBean.produtor.agricultores}"> // É ligado direto classe produtor é um HashSet.
                                                <f:converter converterId="converter.SimpleIndexConverter"/>
                                                <f:selectItems value="#{criarBean.lAgricultores}" />
                                            </h:selectManyCheckbox>
                                        </h:panelGroup>
                               </p:outputPanel>
Bom é isso, alguém sabe como devo proceder pra evitar esse erro? Espero por ajuda...

Obrigado,
Filipe.

Criado 29 de abril de 2011
Ultima resposta 4 de mai. de 2011
Respostas 4
Participantes 2