Começando com Spring + Hibernate + HibernateAnnotations

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:[code]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;
}

}[/code]
E aqui a classe Teste:[code]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;
    }

}[/code]
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:[code]&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=“07356250597” />
</bean>

</beans>[/code]
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.

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

Guilherme,

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

Abraço.

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!

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

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?