Hibernate campo calculado

5 respostas
N

Boa noite pessoal,

Quebrei a cabeça o dia todo para trabalhar com campos calculados e hibernate, bem o que estou tentando fazer é calcular o valor total de um item de pedido. Ex: quantidade * valor_unitario = valor_total.
Como eu estou buscando os dados a partir de uma view no meu BD tentei calcular o valor na mesma, criei um campo na minha classe Entity anotei com @Transient mas também não funcionou.

Como os amigos fazem nas suas aplicações?

Grato pessoal.

[ ]'s

5 Respostas

R

Como você está preenchendo a sua entidade?

L
nandobgi:
Boa noite pessoal,

Quebrei a cabeça o dia todo para trabalhar com campos calculados e hibernate, bem o que estou tentando fazer é calcular o valor total de um item de pedido. Ex: quantidade * valor_unitario = valor_total.
Como eu estou buscando os dados a partir de uma view no meu BD tentei calcular o valor na mesma, criei um campo na minha classe Entity anotei com @Transient mas também não funcionou.

Como os amigos fazem nas suas aplicações?

Grato pessoal.

[ ]'s

o que vc ker fazer ? apenas calcular ??

public class SuaEntity implements Serializable {
    
//... seus propriedades e método persistentes

    public double getCampoCalculado() {
          return getCampo1() * getCampo2();
    }
}

c vc ker mais, quer que quando um registro for inserido haja um calculo para um campo, ou quando um registro for atualizado... então seria assim

public class SuaEntity implements Serializable {
    
    private @Column(nome="valor_total") Double valorTotal;

    public Double getValorTotal() { return valorTotal; }
    
    //ja que é um calculo, não precisa de acesso publico
    protected void setValorTotal(Double valorTotal) { this.valorTotal = valorTotal; }

//... outras propriedades e método persistentes

   
   //esse método pode ter qualquer nome, desde q tenha as anotações
   private @PrePersist @PreUpdate void trigger() { 
        setValorTotal(getQuantidade()*getValorUnitario());
   }
}
N

O problema é que estou utilizando Session do Hibernate para persistencia e essas anotações só funcionam com EntityManager.

Valeu

R

Eu prefiro usar arquivos de mapeamento em vez de anotações, faço o seguinte para definir campos calculados:

L
nandobgi:
O problema é que estou utilizando Session do Hibernate para persistencia e essas anotações só funcionam com EntityManager.

Valeu

não é verdade ^^ ... funciona com session tb... so configurar ^^ ...

e mais, EntityManager do Hiberante é apenas um adaptador para uma Session... tanto que vc pode fazer o seguinte

Session session = ((HiberanteEntityManager)entityManager).getSession();

e depois trabalhar diretamente com a session....

da uma olhada nessa classe que eu tenho... que esta logo abaixo... essa classe carrega a partir de uma EntityManagerFactory, e configura automáticamente para as anotações como @PrePersist funcionarem... e vc pode muito bem trabalhar apenas com sessions... usando

Session s = EntityUtils.getNewSession();

Obs.: vc precisa alterar o nome de "Sua_PU" para o adequado ao seu projeto

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.ejb.HibernateEntityManager;
import org.hibernate.ejb.HibernateEntityManagerFactory;

/**
 *
 * @author Tomaz Lavieri
 */
public class EntityUtils {
    /**
     * Fabrica de Entity Managers
     */
    private static final EntityManagerFactory ENTITY_MANAGER_FACTORY =
            java.beans.Beans.isDesignTime() ?
                null :
                javax.persistence.Persistence
                    .createEntityManagerFactory("Sua_PU");

    /**
     * Fabrica de Hiberante Sessions
     */
    private static final SessionFactory SESSION_FACTORY =
            ((HibernateEntityManagerFactory)ENTITY_MANAGER_FACTORY)
                .getSessionFactory();

    /**
     * Entity Manager publico, usado apenas para consultas.
     */
    public static EntityManager ENTITY_MANAGER =
            ENTITY_MANAGER_FACTORY.createEntityManager();

    /**
     * Hibernate Session publica, usada apenas para consulta (mesma sessão usada
     * por {@link #ENTITY_MANAGER}
     */
    public static Session SESSION =
            ((HibernateEntityManager)ENTITY_MANAGER).getSession();

    /**
     * Cria um novo Entity Manager
     * @return
     */
    public static EntityManager getNewEntityManager() {
        return ENTITY_MANAGER_FACTORY.createEntityManager();
    }

    /**
     * Cria uma nova Hibernate Session.
     * @return
     */
    public static Session getNewSession() {
        return SESSION_FACTORY.openSession();
    }
}
Criado 29 de abril de 2009
Ultima resposta 30 de abr. de 2009
Respostas 5
Participantes 4