Problema load Hibernate

7 respostas
tads

Olá,

Estou tentando fazer um load num objeto, e até agora eu não tava tendo
problema algum… mas, tava vendo no banco de dados
(eu uso o oracle 8.1.7) ee ele está pendurando a sessão, não está
fechando…

olha o método que fiz:

public Object load(Class c, Integer generatedId) throws Exception, ObjectNotFoundException
{
	Object o = null;
	Session session = null;
		
	try
	{
		session = factory.openSession();
		o = (Object) session.load(c, generatedId);
		session.flush();			
	}
	catch (Exception e)
	{
		throw e;
	}
	finally
	{
		session.close();
	}

	return o;
}

Qdo eu vejo na base de dados, a tabela está “lockada” para este…

não sei o que pode ser… alguém pode me dar uma
ajuda por favor???

obrigado,

abraço

7 Respostas

tads

Pessoal,

O mais engraçado nesta história, é que testei todos os java beans,
testando carregar objetos com chaves primarias sendo String, Long
e Integer, mas apenas um objeto está ocorrendo de locar a tabela.
As outras estão corretas, sem lockar as suas respectivas tabelas.

Valew

abraço

urubatan

como esta o hbm desta classe??

tads

Lá vai o hbm, que inclusive estava comparando com outros.:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
    <class name="embarcador.database.bean.manager.TruckDriver" table="caminhoneiro">
        <id name="nbPamcard" column="nr_pamcard">
			<generator class="assigned"/>
		</id>
        <property name="nbSequencePan" column="nr_sequencia_pan"/>
		<property name="carrierPan" column="portador_pan"/>
		<property name="digitPan" column="digito_pan"/>
		<property name="counterPartPamcard" column="via_pamcard"/>
		<property name="digitPamcard" column="digito_pamcard"/>		
		<many-to-one name="cardStatus" column="id_cartao_status"
			class="embarcador.database.bean.manager.CardStatus"/>		
        <many-to-one name="cardType" column="id_cartao_tipo"
			class="embarcador.database.bean.manager.CardType"/>
        <property name="cpf" column="cpf"/>
        <property name="rg" column="rg"/>		
        <many-to-one name="ufRg" column="uf_rg"
			class="embarcador.database.bean.manager.State"/>
		<property name="name" column="nome"/>
		<property name="reducedName" column="nome_reduzido"/>
        <property name="fatherName" column="nome_pai"/>
        <property name="motherName" column="nome_mae"/>
        <property name="dtBirth" column="dt_nascimento"/>		
		<property name="address" column="logradouro"/>		
		<property name="number" column="numero"/>
		<property name="complement" column="complemento"/>
		<property name="burgh" column="bairro"/>		
        <many-to-one name="city" column="id_cidade"
			class="embarcador.database.bean.manager.City"/>
        <property name="cep" column="cep"/>		
		<property name="companyCorporateName" column="razao_social_empresa"/>
		<property name="companyAddress" column="logradouro_empresa"/>
		<property name="companyNumber" column="numero_empresa"/>
		<property name="companyComplement" column="complemento_empresa"/>
		<property name="companyBurgh" column="bairro_empresa"/>
        <many-to-one name="companyCity" column="id_cidade_empresa"
			class="embarcador.database.bean.manager.City"/>
		<property name="companyCep" column="cep_empresa"/>		
		<property name="deliveryAddress" column="logradouro_entrega"/>
		<property name="deliveryNumber" column="numero_entrega"/>
		<property name="deliveryComplement" column="complemento_entrega"/>
		<property name="deliveryBurgh" column="bairro_entrega"/>
        <many-to-one name="deliveryCity" column="id_cidade_entrega"
			class="embarcador.database.bean.manager.City"/>
		<property name="deliveryCep" column="cep_entrega"/>			
		<many-to-one name="addressType" column="id_endereco_tipo"
			class="embarcador.database.bean.manager.AddressType"/>			
		<property name="dtMaintenance" column="dt_manutencao"/>
		<property name="cardExpiration" column="expiracao_cartao"/>
		<bag name="trips" inverse="true" lazy="true">
			<key column="nr_pamcard"/>
			<one-to-many class="embarcador.database.bean.trip.Trip"/>
        </bag>
    </class>
</hibernate-mapping>
<!-- parsed in 0ms -->

valew

abraço

tads

Olá, eu tava conversando sobre este problema no fórum
do hibernate.org e me recomendaram forçar o uso de transações
no método load, ficando assim:

public Object load(Class c, Integer generatedId) throws Exception, ObjectNotFoundException
{
	Object o = null;
	Session session = null;
	Transaction tx = null;		
	
	try
	{
		session = factory.openSession();
		tx = session.beginTransaction();
		o = (Object) session.load(c, generatedId);
		tx.commit();
		session.flush();			
	}
	catch (Exception e)
	{
		try
		{
			tx.rollback();
		}
		catch (HibernateException e1)
		{
			throw e1;
		}
			throw e;
	}
	finally
	{
		try
		{
			session.close();
		}
		catch (HibernateException e1)
		{
			throw e1;
		}
	}		

	return o;
}

do jeito acima, o objeto não ficou “lockado” na base de dados.

O que vs acham desta implementação???

valew!!!

abraço

urubatan

bom, eu sempre utilizo isto na volta dos metodos de acesso a dados, não dentro deles :slight_smile:

mas é sempre bom vc controlar as suas transações.

e se isto resolveu, vc tem um bug no hibernate, pq ele deveria startar uma transação com a session, e commitar ela quando fecha a session

tads

Putz meu!!! sério??

O que eu não entendo é que é sempre qdo executo o load no mesmo objeto TruckDriver… Por que deixa “lockado” sempre este Objeto e não nos outros?

estranho!!!

Mas e agora??? a gente manda email pro Gavin King??? hehe

falow,

abraço

Rafael_Ferraro

Pessoa boa noite. Aproveitando este tópico, venho pedir ajuda a vocês.
Estou começando agora com o Hibernate e VRptor, utilizando a apostila da caelum fj-28
Estou tendo um problema com meu método de alteração de produtos, tipo, não ocorre nenhuma exception, o método é executado normal, mas o resultado não é alterado. Esse erro começou a ocorrer depois que fiz a refatoração no meu código, vou postar o código aqui pra alguem me ajudar.

Classe DAO
public class ProdutoDao {

    private Session sessao;

    public ProdutoDao() {
        this.sessao = new com.vraptor.util.Session().getSession();
    }

    public void altera(Produto produto, int id) {
        Transaction update = sessao.beginTransaction();
        produto = (Produto) sessao.load(Produto.class, id);
        sessao.update(produto);
        update.commit();
    }
}

Classe Main para alterar

public class AlteracaoDeProduto {

    public static void main(String[] args) {
        try {
            Produto p = getProduto();
            new ProdutoDao().altera(p, 2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static Produto getProduto() {
        Produto p = new Produto();
        p.setPreco(2900.00);
        return p;
    }
}
Criado 17 de fevereiro de 2004
Ultima resposta 13 de mar. de 2013
Respostas 7
Participantes 3