Começando com Spring + Hibernate + HibernateAnnotations

4 respostas
bland

Pessoal,

Este post não trata-se de uma dúvida, e sim de uma simples aplicação de exemplo de como inicar com essas novas tecnologias. Tomei a iniciativa de disponibilizar isso para ajudar a todos que estão iniciando com esses frameworks e evitar ficar correndo a Internet para aprender algo que eu considerei muito simples (após quebrar um pouco a cabeça, é claro).

Inicialmente eu fiz o download do Spring e suas dependências (clique aqui para fazer o download) e depois criei um novo Dynamic Web Project no Eclipse com o nome TesteSpring. O banco que eu utilizei para o teste foi o PostgreSQL versão 8.1.

A estrutura do projeto ficou assim:
TesteSpring
  |--src  // Onde ficarão os fontes
  |--xml // Onde ficarão os arquivos XML do Spring
  |--build
      |--classes // Onde ficarão os .class
  |--WebContent
      |--WEB-INF
          |--lib    // Onde ficarão as libs do projeto
Seguindo essa estrutura eu criei um pacote: br.com.teste.dto. Dentro deste eu criei duas classes: Medico e Teste. Aqui vai a classe Medico:
package br.com.teste.dto;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Medico {

  @Id
  @Column(name = "num_crm", nullable = false, length = 8)
  private Integer numeroCrm;

  @Column(name = "nom_medico", length = 100)
  private String nome;

  @Column(name = "cpf_medico", length = 11)
  private String cpf;
	
  public String getCpf() {
    return cpf;
  }

  public void setCpf(String cpf) {
    this.cpf = cpf;
  }

  public String getNome() {
    return nome;
  }

  public void setNome(String nome) {
    this.nome = nome;
  }

  public Integer getNumeroCrm() {
    return numeroCrm;
  }

  public void setNumeroCrm(Integer numeroCrm) {
    this.numeroCrm = numeroCrm;
  }
	
}
E aqui a classe Teste:
package br.com.teste.dto;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.hibernate3.HibernateTemplate;

public class Teste {

  private HibernateTemplate hibernateTemplate;
	
  private Medico medico;
	
  public static void main(String[] args) {
  
    try {

	ApplicationContext context = new ClassPathXmlApplicationContext(
                    new String[] { "hello.xml" } );
			
	BeanFactory factory = ( BeanFactory ) context;
			
	Teste teste = ( Teste ) factory.getBean( "teste" );
			
	teste.updateMedico( teste.getMedico() );
			
	System.out.println( teste.getMedico().getNumeroCrm() );
	System.out.println( teste.getMedico().getNome() );
	System.out.println( teste.getMedico().getCpf() );
			
    } catch (Exception ex) {
	System.out.println( ex.getMessage() );
    }
		
  }
	
  /**
   * Insere ou atualiza um registr de um médico.
   * @param medico
   */
  public void updateMedico(Medico medico) {
    this.getHibernateTemplate().saveOrUpdate(medico);
  }
	
  /**
   * @return the hibernateTemplate
   */
  public HibernateTemplate getHibernateTemplate() {
    return hibernateTemplate;
  }

  /**
   * @param hibernateTemplate the hibernateTemplate to set
   */
  public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
    this.hibernateTemplate = hibernateTemplate;
  }

  /**
   * @return the medico
   */
  public Medico getMedico() {
    return medico;
  }

  /**
   * @param medico the medico to set
   */
  public void setMedico(Medico medico) {
    this.medico = medico;
  }
	
}
Antes de tudo eu criei uma tabela com o nome medico e os campos num_crm (numeric( 8 )), nom_medico (varchar( 100 )) e cpf_medico (varchar( 11 )) e criei, também, um arquivo XML com o nome de hello.xml e coloquei na pasta xml do projeto. Segue abaixo o conteúdo de hello.xml:
&lt?xml version="1.0" encoding="UTF-8"?&gt

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd	
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName">
    <value>org.postgresql.Driver</value>
  </property>
  <property name="url">
    <value>jdbc:postgresql://localhost:5432/postgres</value>
  </property>
  <property name="username">
    <value>postgres</value>
  </property>
  <property name="password">
    <value>fbma110883</value>
  </property>
</bean>
  
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <property name="annotatedClasses">
    <value>br.com.teste.dto.Medico</value>
  </property>
  <property name="hibernateProperties">
    <props>
      <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
      <prop key="hibernate.show_sql">true</prop>
      <prop key="hibernate.format_sql">true</prop>
      <prop key="hibernate.use_sql_comments">true</prop>
      <prop key="hibernate.generate_statistics">true</prop>
    </props>
  </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  <property name="sessionFactory" ref="sessionFactory" />
</bean>
  
<tx:annotation-driven transaction-manager="transactionManager"/>
  
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory"/>
</bean>
 
<bean id="teste" class="br.com.teste.dto.Teste">
  <property name="hibernateTemplate" ref="hibernateTemplate" />
  <property name="medico" ref="medico" />
</bean>
  
<bean id="medico" class="br.com.teste.dto.Medico">
  <property name="numeroCrm" value="4811" />
  <property name="nome" value="Dra. Edinalva Barreto" />
  <property name="cpf" value="[telefone removido]" />
</bean>
 
</beans>
As lib que eu copiei para a pasta lib do meu projeto foram: :arrow: commons-logging.jar (spring-framework-2.0/lib/jakarta-commons) :arrow: ejb3-persistence.jar :arrow: hibernate3.jar (spring-framework-2.0/lib/hibernate) :arrow: hibernate-annotations.jar (spring-framework-2.0/lib/hibernate) :arrow: spring.jar (spring-framework-2.0/dist) :arrow: postgresql-8.2-504.jdbc3.jar :arrow: dom4j-1.6.1.jar (spring-framework-2.0/lib/dom4j) :arrow: jta.jar (spring-framework-2.0/lib/jta) :arrow: commons-collection.jar (spring-framework-2.0/lib/jakarta-commons) :arrow: ehcache-1.2.3.jar (spring-framework-2.0/lib/ehcache) :arrow: cglib-nodep-2.1_3.jar (spring-framework-2.0/lib/cglib)

Bem pessoal, espero ter ajudado a alguns a solucionar muitos dos probleminhas que surgem no início dos estudos de um novo framework.

Abraço a todos.

4 Respostas

guilherme.chapiewski

Não gostei do nome do seu pacote “dto”. Assim os seus objetos de domínio vão se sentir menosprezados!!! :slight_smile:

bland

Guilherme,

Foi apenas para efeito de exemplo, poderia ser qualquer coisa no lugar de “dto”. Mesmo assim, valeu a dica!

Abraço.

bland

Ah, aproveitando a deixa de Guilherme… Em uma conversa com um colega de trabalho eu mencionei sobre a criação de objetos de domínio e ele disse que não faria isso pois toda nova inserção irá requerer a recompilação da classe.

Devido a isso ele costuma criar arquivos .properties. Ele está correto, porém partindo do princípio que se essa modificação ocorrer será, as vezes, exporádica, porque não criar objetos de domínio?

Ai vai a pergunta para vocês, qual que vocês costumam fazer? Criar obejto de domínio ou alocar essas informações em um arquivo .properties?

Abraço a todos!

guilherme.chapiewski

?!?!?!?!?!?!?!?!?!??!?!?!

Cara, ou você entendeu alguma coisa muito errado ou o seu amigo está muito afetado por ácidos :slight_smile:

Poderia explicar melhor o que você quer dizer com isso?

Criado 17 de fevereiro de 2007
Ultima resposta 1 de mar. de 2007
Respostas 4
Participantes 2