Fernando Godoy

Engenharia Backend para Sistemas de Alta Escala

Blog

Projeto Java Desktop com Maven 3º Post

28 de mar. de 20126 min de leitura

Aplicação Desktop MavenAplicação Java Desktop MavenDeskTop MavenHibernateUtilityJavaJAVA + MAVENJava DesktopJAVA SEJAVA SE + MAVENMavenOOOrientação a ObjetosPOM.xml

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