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 aplicacao 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