1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Duvida sobre Spring, Hibernate !

Boa Tarde A todos, espero que alguém possa me ajudar. estou configurando um projeto com spring e hibernate, aparentemente está tudo ok. quando eu subo o projeto é criado a tabela no banco de dados referente a minha classe entidade, então até ai tudo bem.

o problema é que eu tenho uma classe que usa entityManager e nao dei conta de configurar para que possa funcionar, acho que minha configuração so tem configurado um SessionFactory no caso pelo que tenho lido é gerenciado pelo hibernate.

então minha pergunta é o que posso fazer para que seja possível eu persistir um objeto no banco de dados. ou qual configuração preciso alterar para que eu possa utilizar a minha classe que usa o entity manager. qual seria a solução mais facil ?

meu arquivo de configuração do spring. spring-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:c="http://www.springframework.org/schema/c"
    xmlns:cache="http://www.springframework.org/schema/cache"
    xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.2.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
        http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">


    <!--Qual pacote o Spring vai procurar automaticamente as classes anotadas. @ -->
    <context:component-scan base-package="com.simple"/>

    <!-- Ativar o Uso de Anotações na Aplicação -->
    <context:annotation-config/>

    <!-- Ativar o uso do mvc, para spring controlar as requisições -->
    <mvc:annotation-driven />

    <!--Faz com que o Spring tome conta dos services ou controllers onde classes ou metodos estao
    marcados com a anotação >> @Transactional . -->
    <tx:annotation-driven />

    <!-- Configurações do Banco de Dados. -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver"/>
        <property name="url" value="jdbc:postgresql://localhost/SimpleProject"/>
        <property name="username" value="postgres"/>
        <property name="password" value="teste123"/>
    </bean>

    <!-- Configuração do Session Factory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan">
            <value>com.simple.beans</value>
        </property>        
        <property name="hibernateProperties">
            <props>
                <!-- SQL dialeto -->
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <!-- Criar Tabelas -->
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
                <prop key="hibernate.enable_lazy_load_no_trans">true</prop>
            </props>
        </property>
    </bean>

    <!-- Trasaction Manager -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
        p:sessionFactory-ref="sessionFactory">
    </bean>


    <!-- Configuração Spring-MVC -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value=""/>
        <property name="suffix" value=".html"/>
    </bean>        
    </beans>

minha classe java que usa o entityManager, porem gostaria de usar o session ou mudar a configuração para utilizar essa classe.

package com.simple.service;

import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.hibernate.SessionFactory;
import org.hibernate.type.Type;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import com.simple.model.ModelBase;


@Transactional
public abstract class ServiceBaseDefault <T extends ModelBase<?>> implements ServiceBase<T>{


    @PersistenceContext
    protected EntityManager em; 

    @Autowired
    @Transactional
    public void save(T entity){
        Object id = entity.getId();
        if(id == null){
            em.persist(entity);
        }else
            em.merge(entity);
    }

    @Autowired
    @Transactional(readOnly = false)
    public void delete(Object id) throws EntityNotFoundException{
        em.remove(this.getById(id));
    }

    @Autowired
    @Transactional(readOnly = true)
    public T getById(Object id) throws EntityNotFoundException{
        T entity = (T) em.find(this.getClassT(),id);
        if(entity == null){
            throw new EntityNotFoundException();
        }else
            return entity;
    }

    private Class<T> getClassT(){
        Type type = (Type) getClass().getGenericSuperclass();
        if(type instanceof ParameterizedType){
            ParameterizedType paramType = (ParameterizedType)type;
            Class<T> tClass = (Class<T>)paramType.getActualTypeArguments()[0];
            return tClass;
        }else
            return null;
    }

    @Autowired
    @Transactional(readOnly = true)
    @SuppressWarnings("unchecked")
    public List<T> findAll() { 
        Query q = em.createQuery("from " + getClassT().getName() + " t");  
        return q.getResultList(); 
    }


    @Autowired
    @Transactional(readOnly = true)
    @SuppressWarnings("unchecked")
    public List<T> findByFields(Map<String, Object> fields, Boolean exclusive, int maxResults, String orderBy) { 
        StringBuilder strbld = new StringBuilder("from " + getClassT().getName() + " t");
        String param = "";
        String connector = " where ";
        if (fields != null) {
            for (String key : fields.keySet()) {
                param = key.replace(".", "");
                if (fields.get(key) instanceof String) { 
                    String strfld = (String) fields.get(key); 
                    if (strfld.equals("is null")) 
                        strbld.append(connector + "t." + key + " is null"); 
                    else if (strfld.equals("is not null")) 
                        strbld.append(connector + "t." + key + " is not null");
                    else if (strfld.startsWith("like ")) 
                        strbld.append(connector + "lower(t." + key + ") like lower(:" + param + ")");
                    else if (strfld.startsWith("!= "))
                        strbld.append(connector + "t." + key + " != :" + param);
                    else strbld.append(connector + "t." + key + " = :" + param);
                    } else strbld.append(connector + "t." + key + " = :" + param);
                if (exclusive)
                    connector = " and ";
                else connector = " or ";
                } 
            }
        if (orderBy != null) {
            if (!"".equals(orderBy.trim())) {
                strbld.append(" order by t." + orderBy);
                } 
            }
        Query q = em.createQuery(strbld.toString());
        if (maxResults > 0)
            q.setMaxResults(maxResults); 
        param = "";
        for (String key : fields.keySet()) {
            if (!fields.get(key).equals("is null") && !fields.get(key).equals("is not null")) {
                param = key.replace(".", "");
                if (fields.get(key) instanceof String) {
                    String strfld = (String) fields.get(key);
                    if (strfld.startsWith("like ")) { 
                        strfld = strfld.replace("like ", "").replace("'", ""); 
                        q.setParameter(param, strfld); 
                        }
                    else if (strfld.startsWith("!= ")) {
                        strfld = strfld.replace("!= ", "");
                        q.setParameter(param, strfld);
                        } else q.setParameter(param, fields.get(key));
                    } else q.setParameter(param, fields.get(key));
                }
            } 
        return (List<T>) q.getResultList();
    }

}

Alguem poderia me dar uma força ?

eu coloquei um metodo para teste que é o seguinte :

        AnnotationConfiguration configuration = new AnnotationConfiguration();
         configuration.configure();

         SessionFactory factory = configuration.buildSessionFactory();
         Session session = factory.openSession();

         Produto produto = new Produto();
         produto.setName("Prateleira");


         Transaction tx = session.beginTransaction();
         session.save(produto);        
         tx.commit();

agora o jboss reclama que eu nao configurei um hibernate.conf..

porem na minha configuração do spring ja consta a configuração do hibernate, é obrigatório criar outro arquivo para que possa persistir os dados ?

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java hibernate spring ou faça a sua própria pergunta.