Olá galera,

Para este post estarei criando nossas entidades para damos inicio a parte legal do projeto.

Bom como disse é sistema vai ser algo bem simples e por se tratar de algo que servirá de estudos para iniciantes em programação vamos fazer um cadastro de cidades e estados.

Particularmente não faço este tipo de cadastro em nenhum de meus sistemas, deixar com que o usuário efetue tal tipo de cadastro pode gerar inconsistência no banco de dados, pois, damos ao o usuário o poder de cadastrar cidades e estados que não existem, além de cidades em estados errados. Exemplo claro, o usuário por engano cadastrar Porto Alegre no estado de São Paulo, isto seria um problema e tanto não dando nenhuma credibilidade a informações que nosso sistema fornecerá. Neste caso prefiro inserir cidades e estados diretamente no banco evitando este tipo de problema. Pense pelo seguinte é muito difícil surgir estados e cidades novas do dia pra noite e caso surgir, não é nada fora do comum inserir diretamente no banco um estado e cidade nova. Lembrando opinião particular todo caso gera exceções, por isso analisem bem sua regra de negocio antes de sair criando classes e programando.

Dando sequencia e começando pela entidade estado.

No pacote br.com.meuprimeroprojeto.modelo, vamos criar uma nova classe Java e dar nome a ela de Estado.

Primeiro passo e o mais importante, definir os atributos que nosso estado irá ter. No nosso caso, nome e sigla ficando conforme abaixo.

package br.com.meuprimeiroprojeto.modelo;

/**
*
* @author Fernado
*/

public class Estado {
  private Long idEstado;
  private String nome;
  private String sigla;
}

Feito isso criaremos uma nova classe Java e daremos o nome a ela de Cidade. No caso, somente o nome, porém aqui entra uma coisa interessante. Java é uma linguagem orientada a objetos, para quem não intende orientação a objetos lei este POST, acredito que irá ajudar. Neste caso já possuímos um objeto Estado e se formos pensar, toda cidade fica dentro de um Estado certo?

Neste caso nossa classe cidade ficará da seguinte forma.

package br.com.meuprimeiroprojeto.modelo;

/**
*
* @author Fernado
*/

public class Cidade {
  private Long idCidade;
  private String nome;
  private Estado estado;
}

Bem como o post não ficou extenso vamos fazer o mapeamento objeto relacional das classes pra que o Hibernate crie as tabelas de nosso banco de dados.

Para fazer o mapeamento usaremos algumas Annotations.

Vamos lá:

@Entity: Informa que a classe mapeada é persistente

@Id: Definição de chave primária.

@GeneratedValue: Permite a geração de forma automática para o valor identificador baseados nos mecanismos de geração automática que existem no Hibernate. @GeneratedValue(strategy=”GenerationType.IDENTITY”)  Para este estou utilizando o mecanismo de geranção IDENTITY que é utilizada pra criar colunas identidades na maioria dos bancos de dados, porém existem outros, como SEQUENCE, INCREMENT, AUTO e TABLE, basta escolher o que melhor se aplica ao seu caso.

@ManyToOne: Informa a cardinalidade de muitos para um ao banco de dados. Para mapearmos quando inserimos um objeto dentro de outro é necessário que se informe tal Annotation. Em nosso caso, temos um objeto Estado dentro do objeto Cidade, ao se utilizá-la estamos informando que existem muitas Cidades dentro de um Estado.

Obs: Fiz um breve comentário sobre as Annotations utilizadas neste post, caso queira saber mais recomendo pesquisar algo, existem deversas annotations criadas para facilitar o mapeamento objeto relacional entre outras coisas.

Feito isso basta irmos ao HibernateUtility que se no pacote útil e informar as classes que queremos que o Hibenate mapie para nós deixando o arquivo conforme abaixo.

package br.com.meuprimeiroprojeto.util;

import br.com.meuprimeiroprojeto.modelo.Cidade;
import br.com.meuprimeiroprojeto.modelo.Estado;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class HibernateUtility {

  private static final SessionFactory factory;
  private static final ThreadLocal sessionThread = new ThreadLocal();
  private static final ThreadLocal transactionThread = new ThreadLocal();

  public static Session getSession() {
    Session session = (Session) sessionThread.get();
    if ((session == null) || (!(session.isOpen()))) {
      session = factory.openSession();
      sessionThread.set(session);
    }
    return ((Session) sessionThread.get());
  }

  public static void closeSession() {
    Session session = (Session) sessionThread.get();
    if ((session != null) && (session.isOpen())) {
      sessionThread.set(null);
      session.close();
    }
  }

  public static void beginTransaction() {
    Transaction transaction = getSession().beginTransaction();
    transactionThread.set(transaction);
  }

  public static void commitTransaction() {
    Transaction transaction = (Transaction) transactionThread.get();
    if ((transaction != null) && (!(transaction.wasCommitted())) && (!(transaction.wasRolledBack()))) {
      transaction.commit();
      transactionThread.set(null);
    }
  }

  public static void rollbackTransaction() {
    Transaction transaction = (Transaction) transactionThread.get();
    if ((transaction != null) && (!(transaction.wasCommitted())) && (!(transaction.wasRolledBack()))) {
      transaction.rollback();
      transactionThread.set(null);
    }
  }

  static {
    try {
      factory = new Configuration()
      /***POSTGRESQL***/
      //                    .setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect")
      //                    .setProperty("hibernate.connection.driver_class", "org.postgresql.Driver")
      //                    .setProperty("hibernate.connection.url", "jdbc:postgresql://localhost/meuprimeiroprojeto")
      //                    .setProperty("hibernate.connection.username", "postgres")
      //                    .setProperty("hibernate.connection.password", "postgres")
      /***MYSQL***/
      .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect")
      .setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver")
      //CONFIGURAÇÃO DA BASE DE DADOS ** Verificar sempre Username e Password caso necessario alterar.
      .setProperty("hibernate.connection.url", "jdbc:mysql://localhost/meuprimeiroprojeto")
      .setProperty("hibernate.connection.username", "root")
      .setProperty("hibernate.connection.password", "root")

      //                    .setProperty("hibernate.connection.datasource", "jdbc/dbSGC") //data source (so pra aplicação web e tem q configurar no tomcat)
      .setProperty("hibernate.hbm2ddl.auto", "update")
      .setProperty("hibernate.c3p0.max_size", "10")
      .setProperty("hibernate.c3p0.min_size", "2")
      .setProperty("hibernate.c3p0.timeout", "5000")
      .setProperty("hibernate.c3p0.max_statements", "10")
      .setProperty("hibernate.c3p0.idle_test_period", "3000")
      .setProperty("hibernate.c3p0.acquire_increment", "2")
      .setProperty("show_sql", "true")
      .setProperty("use_outer_join", "true")
      .setProperty("hibernate.generate_statistics", "true")
      .setProperty("hibernate.use_sql_comments", "true")
      .setProperty("hibernate.format_sql", "true")
      //CLASSES PARA MAPEAMENTO
      .addAnnotatedClass(Cidade.class)
      .addAnnotatedClass(Estado.class)

      .buildSessionFactory();
    } catch (RuntimeException e) {
      e.printStackTrace();
      throw e;
    }
  }

  public static void main(String [] args) {

  }

}

Ao termino temos nossas classes com as devidas annotations ficarma da seguinte forma:

Classe Estado

package br.com.meuprimeiroprojeto.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
*
* @author Fernado
*/
@Entity
public class Estado {

  @Id
  @GeneratedValue(strategy= GenerationType.IDENTITY)
  private Long idEstado;
  private String nome;
  private String sigla;

  //GETTERS E  SETTERS OMITIDOS

}
<pre>

Classe Cidade

package br.com.meuprimeiroprojeto.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

/**
*
* @author Fernado
*/
@Entity
public class Cidade {

  @Id
  @GeneratedValue(strategy= GenerationType.IDENTITY)
  private Long idCidade;
  private String nome;
  @ManyToOne
  private Estado estado;

  //GETTERS E  SETTERS OMITIDOS
}

Para concluir, basta abrir MySQL e criarmos um novo schema dando a ele o nome dele de meuprimeiroprojeto.

Com isso termino por aqui e até o próximo post.

Fiz algumas alterações no arquivo POM.xml estarei deixando disponivel o código no GITHUB