1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Dúvida Sobre Query E Insert No Hibernate

Tenho uma tabela empresa e uma tabela período (do dia). O relacionamento delas é de N to N. Toda vez que eu vou fazer um insert em empresa, faço também um insert em período, mas enquanto em empresa posso ter infinitas linhas (cada linha representa uma empresa diferente) em período eu só posso ter 2 linhas (dia, noite). Estou usando Hibernate e JPA 2.0. Acredito que toda vez que eu um EntityManager em; em.persist(empresa), ele vai persitir de novo os períodos do dia, ficando na tabela periodo as linhas dia e noite várias vezes repetida. Como faço para o Hibernate a cada em.persist(empresa) apenas inserir os dados na tabela empresa e na tabela associativa com o periodo com os ids das linhas já existentes, mas não na tabela periodo ? Ou seja, ao inves de inserir "dia" na tabela periodo (pois "dia já está lá) faz uma query em periodo e busca o id da linha "dia" e faz um insert na tabela empresa (normalmente) e um insert na tabela associativa com o id da empresa que ele acabou de inserir e o id do periodo que ele buscou ? Segue em anexo as classes mapeadas.

Periodo.java

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name = "periodo")
@NamedQueries({
    @NamedQuery(name = "Periodo.findAll", query = "SELECT p FROM Periodo p")})
public class Periodo implements Serializable 
{
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "cd_periodo")
    private Integer cd;
    @Basic(optional = false)
    @Column(name = "nm_periodo")
    private String nomePeriodo;
    @ManyToMany(mappedBy = "periodoCollection")
    private Collection<Empresa> empresaCollection;

    public Periodo() {
    }

    public Periodo(Integer cd) {
        this.cd = cd;
    }

    public Periodo(Integer cd, String nomePeriodo) {
        this.cd = cd;
        this.nomePeriodo = nomePeriodo;
    }

    public Integer getCd() {
        return cd;
    }

    public void setCd(Integer cd) {
        this.cd = cd;
    }

    public String getNomePeriodo() {
        return nomePeriodo;
    }

    public void setNomePeriodo(String nomePeriodo) {
        this.nomePeriodo = nomePeriodo;
    }

    public Collection<Empresa> getEmpresaCollection() {
        return empresaCollection;
    }

    public void setEmpresaCollection(Collection<Empresa> empresaCollection) {
        this.empresaCollection = empresaCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (cd != null ? cd.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Periodo)) {
            return false;
        }
        Periodo other = (Periodo) object;
        if ((this.cd == null && other.cd != null) || (this.cd != null && !this.cd.equals(other.cd))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Periodo[ cd=" + cd + " ]";
    }

}

Empresa.java

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "empresa")
@NamedQueries({
    @NamedQuery(name = "Empresa.findAll", query = "SELECT e FROM Empresa e")})
public class Empresa implements Serializable 
{
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "cd_empresa")
    private Integer cd;
    @JoinTable(name = "item_empresa_periodo", joinColumns = {
        @JoinColumn(name = "cd_empresa", referencedColumnName = "cd_empresa")}, inverseJoinColumns = {
        @JoinColumn(name = "cd_periodo", referencedColumnName = "cd_periodo")})
    @ManyToMany
    private Collection<Periodo> periodoCollection;
    @OneToMany(mappedBy = "cdTipo")
    private Collection<Tipo> tipoCollection;

    public Empresa() {
    }

    public Empresa(Integer cd) {
        this.cd = cd;
    }

    public Integer getCd() {
        return cd;
    }

    public void setCd(Integer cd) {
        this.cd = cd;
    }

    public Collection<Periodo> getPeriodoCollection() {
        return periodoCollection;
    }

    public void setPeriodoCollection(Collection<Periodo> periodoCollection) {
        this.periodoCollection = periodoCollection;
    }

    public Collection<Tipo> getTipoCollection() {
        return tipoCollection;
    }

    public void setTipoCollection(Collection<Tipo> tipoCollection) {
        this.tipoCollection = tipoCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (cd != null ? cd.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Empresa)) {
            return false;
        }
        Empresa other = (Empresa) object;
        if ((this.cd == null && other.cd != null) || (this.cd != null && !this.cd.equals(other.cd))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Empresa[ cd=" + cd + " ]";
    }
}
  • quando você diz: Acredito que toda vez que eu um EntityManager em; em.persist(empresa), ele vai persitir de novo os períodos do dia, ficando na tabela periodo as linhas dia e noite várias vezes repetida você testou isto ? pois se esta dando insert é um registro novo e vai ter período, caso não seja um registro novo vc deve ter o Id, logo vc vai estar em um estado gerenciado do objeto, fazendo um simples set vc faz update, por isto pergunto, vc testou e realmente esta com este comportamento ?

    Dilnei Cunha   23 de jul de 2014
  • Mas cada empresa só pode ter um período? se for isso é manyToOne e não manyToMany.

    Alex Correa   23 de jul de 2014
  • Dilnei Cunha: Não, na verdade eu não testei, e sim, ao construir a aplicação eu imaginei este comportamento.

    Kratos   24 de jul de 2014
  • Alex Correa: Cada empresa pode ter mais de um período. O mapeamento foi realizado automaticamente pelo Netbeans a partir do banco de dados já feito.

    Kratos   24 de jul de 2014
  • No meu ver o mapeamento esta correto, e vc não terá esses registros duplicados como diz, esse joinTable é para aquelas tabelas associativas NN.

    Dilnei Cunha   24 de jul de 2014
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java hibernate sql insert busca persistência ou faça a sua própria pergunta.