Duvidas sobre HIBERNATE

  1. Ele deixa o projeto final mais lento?
  2. È uma boa pratica usar? ou é melhor fazer tudo no braco?
  3. Quanto tempo demora para dominar o Hibernate?

Obrigada!

[quote=biluquinha]1) Ele deixa o projeto final mais lento?
2) È uma boa pratica usar? ou é melhor fazer tudo no braco?
3) Quanto tempo demora para dominar o Hibernate?

Obrigada![/quote]

  1. Sim ele é mais lento, mas essa lentidão compensa com a a agilidade na hora de desenvolver.
  2. Hoje em dia, não mais vantagem fazer no braço
  3. Não existe isso de dominar, quando vc axar que ta sabendo bastante, eles atualizam e pronto, vamos aprender tudo de novo. A palavra dominar em programação não existe

[]'s

A questão de ser lendo é dependente da situação, algumas vezes hibernate até promove ganhos de desempenho, um exemplo é a utilização de cache do hibernate, vc não precisa consultar sempre no banco algo que não mudou, hibernate controla isso pra vc.

Hmmm, depende mesmo, se tua conexão com o banco de dados, não for a melhor do mundo, ele deixa mais rapido ^^, como o colega acima falou, devido ao cache que ele pode fazer,

Na minha opinião JPA (que é as anotações que vc faz) é o melhor caminho, o Hiberante é apenas uma consequencia do JPA, pois é a ferramente mais popular, alem de diminuir concideravelmente o tempo de desenvolvimento, onde vc não tera que reinventar a roda, recriando conexões, e formas de manipular o dado no banco de dados

O principal é fazer direito a parte do JPA, ou seja, as anotações, e se vc usa uma IDE poderosa como o netbeans, ele faz quase tudo pra vc, configura o banco com o hiberante, faz engenharia reversa (ou seja a partir de um banco de dados pronto, ele cria as classes com o JPA que representa o banco …

ai depois disso é vc adcionar as restrições do banco e ser feliz…

Posso te falar que o principal cuidado com o mapeamento automático que as IDEs fazem, é na parte de 1-N ou N-N … o relacionamento é sempre um ponto que deixa duvida no pessoal e quase todos, liberam a lista da Entidade via método get/set o que pra mim é um erro sem precedentes, pois vc pode destruir a consistencia do seu projeto ^^ …

Apenas pra exemplificar o que estou falando,

O NETBEANS e a maioria das pessoas MAPEA ASSIM

[code]import static javax.persistence.CascadeType.ALL;
import static javax.persistence.FetchType.LAZY;

@Entity
@Table(name=“pais”,uniqueConstraints = @UniqueConstraint(columnNames=“nome”))
public class Pais implements Serializable{

//… outras propriedades

@OneToMany(cascade=ALL, mappedBy = "pais", fetch = LAZY)
private Set<Estado> estados = new LinkedHashSet<Estado>(0);

//… outros métodos gets e sets

public Set<Estado> getEstados() { //<<=== FAIL! fazendo assim, a pessoa vai adcionar o que quiser a sua lista de estados
    return estados;
}

public voi setEstado(Set<Estado> estados) { //<=== FAIL! ninguem fora da classe deve criar a lista sozinha e adcionar aqui...
    this.estados = estados;
}

}[/code]

Eu prefiro uns 100% a mais a seguinte abordagem…

[code]@Entity
@Table(name=“pais”,uniqueConstraints = @UniqueConstraint(columnNames=“nome”))
public class Pais implements Serializable{

//… outras propriedades

@OneToMany(cascade={MERGE,PERSIST,REFRESH}, mappedBy = "pais", fetch = LAZY)
private Set<Estado> estados = new LinkedHashSet<Estado>(0);

public Set<Estado> getEstados() {
    return Collections.unmodifiableSet(estados); //retorna a lista, mas sem operações de ADD ou REMOVE.
}

private Set<Estado> getModifiableEstados() { //a lista modificavél só é acessada internamente...
    return estados;
}

//antes de adcionar um estado, eu testo sua consistencia
public Pais add(Estado estado) throws NotFromThisPaisException,
        NotUniqueArgumentException, IllegalNullArgumentException {
    Consistencies.notNull(this, "estados", estado); //o estado enviado não pode ser null
    if (estado.getPais() == null) //se não houver nenhum pais setado, eu seto esse com o pais do estado
        estado.setPais(this);
    else if (!equals(estado.getPais())) //se o estado ja pertence a outro pais, eu lanço uma exceção.
        throw new NotFromThisPaisException(this, estado);

    Estado sameEntity = Consistencies.notDuplicated(this, "estados", estado,
            getEstados()); //eu verifico se o estado já tem na lista
    if (sameEntity != null)
        getModifiableEstados().remove(sameEntity);

    getModifiableEstados().add(estado); //se passar em todos os teste eu adciono.
    return this;
}

public Estado addEstado(String nomeDoEstado) throws
        IllegalNullArgumentException, MaximumSizeException,
        MinimumSizeException, NotUniqueArgumentException {

    Estado estado = new Estado(nomeDoEstado, this); //crio o estado
    add(estado); //adciono a este pais, este método faz os testes se é possivel adcionar
    return estado; //retorno o estado criado
}

public boolean remove(Estado estado) {
    return getModifiableEstados().remove(estado);
}
public boolean removeAll(Collection<Estado> estados) {
    return getModifiableEstados().removeAll(estados);
}
public Estado removeEstado(final String nomeDoEstado) {
    return CollectionUtils.removeFirst(
            getModifiableEstados(),
            Estado.criterionForNome(nomeDoEstado));
}
public void removeAllEstados() {
    getModifiableEstados().clear();
}

}[/code]

sei que parece bem complicado, porem assim, eu mantenho a integridade dos meus paises 100% do tempo, e tenho certeza que qualquer estado adcionado ao pais, vai ser consistente, e não terei coisas como

Pais brasil = …
brasil.getEstado().add(new Estado());
brasil.getEstado().add(new Estado());
brasil.getEstado().add(new Estado()); //adcionando 3 estados em branco

o que estragaria o objeto brasil

[quote=biluquinha]Obrigada![/quote] Por nada…