Evento.java package dominio; import java.util.Date; import java.util.Set; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity public class Evento { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; private String nome; private String descricao; @OneToMany(mappedBy = "evento", fetch = FetchType.LAZY) private Set<Palestra> palestras; @Temporal(TemporalType.DATE) private Date dataIncio; @Temporal(TemporalType.DATE) private Date dataTermino; @Temporal(TemporalType.DATE) private Date dataIncioInscricoes; @Temporal(TemporalType.DATE) private Date dataTerminoInscricoes; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public Set<Palestra> getPalestras() { return palestras; } public void setPalestras(Set<Palestra> palestras) { this.palestras = palestras; } public Date getDataIncio() { return dataIncio; } public void setDataIncio(Date dataIncio) { this.dataIncio = dataIncio; } public Date getDataTermino() { return dataTermino; } public void setDataTermino(Date dataTermino) { this.dataTermino = dataTermino; } public Date getDataIncioInscricoes() { return dataIncioInscricoes; } public void setDataIncioInscricoes(Date dataIncioInscricoes) { this.dataIncioInscricoes = dataIncioInscricoes; } public Date getDataTerminoInscricoes() { return dataTerminoInscricoes; } public void setDataTerminoInscricoes(Date dataTerminoInscricoes) { this.dataTerminoInscricoes = dataTerminoInscricoes; } } Palestra.java package dominio; import java.util.Set; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; @Entity public class Palestra { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; private String nome; private String descricao; private String areaConhecimento; private int numeroVagas; @OneToMany(mappedBy = "palestra", fetch = FetchType.LAZY) private Set<Inscricao> inscricoes; @ManyToOne(fetch = FetchType.EAGER) private Evento evento; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public String getAreaConhecimento() { return areaConhecimento; } public void setAreaConhecimento(String areaConhecimento) { this.areaConhecimento = areaConhecimento; } public int getNumeroVagas() { return numeroVagas; } public void setNumeroVagas(int numeroVagas) { this.numeroVagas = numeroVagas; } public Set<Inscricao> getInscricoes() { return inscricoes; } public void setInscricoes(Set<Inscricao> inscricoes) { this.inscricoes = inscricoes; } public Evento getEvento() { return evento; } public void setEvento(Evento evento) { this.evento = evento; } } Participante package dominio; import java.util.Date; import java.util.Set; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity public class Participante { @Id private String cpf; private String nome; private String email; private String curso; private String instituicao; private String telefone; private String endereco; private String numero; private String bairro; private String municipio; private String uf; private String cep; @Temporal(TemporalType.TIMESTAMP) private Date dataCadastro; @OneToMany(fetch = FetchType.LAZY, mappedBy = "participante") private Set<Inscricao> inscricoes; 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 String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getCurso() { return curso; } public void setCurso(String curso) { this.curso = curso; } public String getInstituicao() { return instituicao; } public void setInstituicao(String instituicao) { this.instituicao = instituicao; } public String getTelefone() { return telefone; } public void setTelefone(String telefone) { this.telefone = telefone; } public String getEndereco() { return endereco; } public void setEndereco(String endereco) { this.endereco = endereco; } public String getNumero() { return numero; } public void setNumero(String numero) { this.numero = numero; } public String getBairro() { return bairro; } public void setBairro(String bairro) { this.bairro = bairro; } public String getMunicipio() { return municipio; } public void setMunicipio(String municipio) { this.municipio = municipio; } public String getUf() { return uf; } public void setUf(String uf) { this.uf = uf; } public String getCep() { return cep; } public void setCep(String cep) { this.cep = cep; } public Date getDataCadastro() { return dataCadastro; } public void setDataCadastro(Date dataCadastro) { this.dataCadastro = dataCadastro; } public Set<Inscricao> getInscricoes() { return inscricoes; } public void setInscricoes(Set<Inscricao> inscricoes) { this.inscricoes = inscricoes; } } Inscricao.java package dominio; import java.util.Date; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity public class Inscricao { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int numeroInscricao; @ManyToOne(fetch = FetchType.EAGER) private Participante participante; @ManyToOne(fetch = FetchType.EAGER) private Palestra palestra; @Temporal(TemporalType.TIMESTAMP) private Date dataInscricao; public int getNumeroInscricao() { return numeroInscricao; } public void setNumeroInscricao(int numeroInscricao) { this.numeroInscricao = numeroInscricao; } public Participante getParticipante() { return participante; } public void setParticipante(Participante participante) { this.participante = participante; } public Date getDataInscricao() { return dataInscricao; } public void setDataInscricao(Date dataInscricao) { this.dataInscricao = dataInscricao; } public Palestra getPalestra() { return palestra; } public void setPalestra(Palestra palestra) { this.palestra = palestra; } } Além das entidades acima exibidas, precisamos definir o arquivo de configuração “persistence.xml”. <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="estacio"> <class>dominio.Evento</class> <class>dominio.Palestra</class> <class>dominio.Inscricao</class> <class>dominio.Participante</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/estacio" /> <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" /> <property name="javax.persistence.jdbc.password" value="estacio" /> <property name="javax.persistence.jdbc.user" value="estacio" /> <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> </properties> </persistence-unit> </persistence> Na próxima classe utilizaremos o padrão de projeto Singleton como forma de obter um meio único e centralizado de obtermos um objeto do Tipo EntityManager. Chamaremos essa classe de JPAUtil e terá um único método getEntityManager responsável por retornar a instância do EntityManager necessário para realizarmos nossas operações sobre o banco de dados. JPAUtil.java package dao; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class JPAUtil { private static EntityManagerFactory emf = null; private static EntityManager em = null; public static EntityManagerFactory getEntityManagerFactory() { if (emf == null) emf = Persistence.createEntityManagerFactory("estacio"); return emf; } public static EntityManager getEntityManager() { if (em != null && em.isOpen()) return em; else { em = getEntityManagerFactory().createEntityManager(); return em; } } } Além do Singleton apresentado acima também criaremos uma DAO para cada uma de nossas entidades. Contudo nas classes apresentadas abaixo, incluiremos somente os métodos necessários para a exceção do nosso módulo exemplo, que será a inscrição de participantes nos eventos disponíveis. Os métodos estarão comentados para que tenhamos um melhor entendimento de suas funcionalidades. DAOEvento.java package dao; import java.util.Date; import java.util.List; import java.util.Set; import javax.persistence.EntityManager; import javax.persistence.Query; import dominio.Evento; import dominio.Palestra; public class DAOEvento { private static EntityManager entityManager; static{ entityManager = JPAUtil.getEntityManager(); } //Recupera todos os eventos em que data atual seja menos que a dataTerminoInscricoes public static List<Evento> getEventosValidos() { Query query = entityManager.createQuery("Select e from Evento e where e.dataTerminoInscricoes > :dataAtual"); query.setParameter("dataAtual", new Date()); return query.getResultList(); } //Localiza um evento com base em seu id public static Evento localizar(int id){ return entityManager.find(Evento.class, id); } public static Set<Palestra> listaPalestrasEvento(int idEvento){ return entityManager.find(Evento.class, idEvento).getPalestras(); } } DAOInscricao.java package dao; import javax.persistence.EntityManager; import javax.persistence.Query; import dominio.Inscricao; public class DAOInscricao { private static EntityManager entityManager; static{ entityManager = JPAUtil.getEntityManager(); } public static boolean verificaSeJaInscrito(Inscricao inscricao) { // Criamos uma consulta EJBQL que nos retorna um objeto do tipo Inscricao Query query = entityManager .createQuery("select i from Inscricao i where i.participante.cpf = :cpfParticipante and i.palestra.id = :idPalestra"); // Setamos os parâmetros CPF e palestra para verificar se o participante // já está inscrito para a palestra selecionada query.setParameter("cpfParticipante", inscricao.getParticipante() .getCpf()); query.setParameter("idPalestra", inscricao.getPalestra().getId()); // Caso não seja encontrado um resultado será lançada uma // javax.persistence.NoResultException return (query.getResultList().isEmpty()) ? false : true; } public static void salvaIncricao(Inscricao inscricao) { // Iniciamos uma transação entityManager.getTransaction().begin(); // Verificamos se o participante já está cadastrado no banco de dados // Caso não exista, será persistido DAOParticipante daop = new DAOParticipante(); if (daop.localizaParticipante(inscricao.getParticipante().getCpf()) == null) { entityManager.persist(inscricao.getParticipante()); // Caso contrário, seus dados serão atualizados } else { entityManager.merge(inscricao.getParticipante()); } // Persistimos a inscrição entityManager.persist(inscricao); // "Commitamos" a transação entityManager.getTransaction().commit(); } } DAOParticipante.java package dao; import javax.persistence.EntityManager; import dominio.Participante; public class DAOParticipante { private EntityManager entityManager; public DAOParticipante(){ entityManager = JPAUtil.getEntityManager(); } public Participante localizaParticipante(String cpf) { // Localiza participante return entityManager.find(Participante.class, cpf); } } DAOPalestra.java package dao; import javax.persistence.EntityManager; import dominio.Palestra; public class DAOPalestra { private static EntityManager entityManager; static{ entityManager = JPAUtil.getEntityManager(); } public static Palestra localizarPalestra(int idPalestra) { return entityManager.find(Palestra.class, idPalestra); } }