Categories
Eventos Java Notícias

Falando em Java 2008, aí vou eu!

Falando em Java 2008Na próxima semana estarei em São Paulo para o Falando em Java 2008, um ótimo evento realizado anualmente pelos amigos da Caelum, a melhor empresa de treinamentos em desenvolvimento de software do Brasil na atualidade.

Esse ano haverá a ilustre presença do Emmanuel Bernard (um dos líderes do projeto Hibernate na JBoss) que fará duas apresentações, uma sobre JPA 2.0 e outra sobre Hibernate Search. Por uma grande ironia do destino, a palestra de Hibernate Search foi uma das que eu não consegui assistir na JBoss World 2008 e agora vou ter minha segunda chance! Além disso esse ano não se falará só em Java mas também em arquitetura de software, Domain-Driven Design, JRuby on Rails, Scrum e AJAX.

Nos vemos por lá! 🙂

Categories
Engenharia de software Eventos

[JBoss World 2008] O Hibernate Validator me incomoda…

JBoss World 2008 - BOFAcabei de participar de um BOF com Emmanuel Bernard, Gavin King, Pete Muir, Max Andersen e mais uma dezena de pessoas.

O assunto era desenvolvimento de aplicações usando Hibernate, Seam e outras coisas mais da Red Hat. Dentre as várias coisas que foram discutidas, falamos sobre o Hibernate Validator.

O Hibernate Validator me incomoda, e é um pouco complicado de explicar o motivo, mas eu vou tentar. Na verdade não é o Validator em sí, mas as suas annotations. Vejamos um exemplo de código traduzido da página Validator. A sintaxe é muito simples e mesmo que você não saiba exatamente como funciona provavelmente conseguirá entender:

public class Endereco {
 
    @NotNull private String rua;
    private String cep;
    private String estado;
 
    @Length(max = 20)
    @NotNull
    private String pais;
 
    @Range(min = -2, max = 50, message = "Andar invalido")
    public int andar;
 
        ...
}

Na minha concepção, quando usamos o Hibernate Validator dessa forma, passamos a ter regras de negócio/validação do objeto fora do seu controle, e essas regras não estão fortemente encapsuladas. A verificação de que um endereço deve ter no máximo 20 caracteres, por exemplo, deveria estar encapsulada dentro de um método que cria/atualiza o endereço, e não numa annotation.

Existe uma discussão muito grande sobre isso. De um lado, os “puristas” acreditam que colocar annotations num objeto de domínio significa acoplar esses objetos à infraestrutura e implementações específicas. Do outro lado, os “práticos” acham que isso não tem o menor problema, que na prática o efeito colateral disso é nulo.

Eu sinceramente fico meio dividido. O que eu sei é que isso de alguma forma me incomoda. Estou acostumado a pensar de um modo “Domain-Driven Design”, e para mim o mais natural e certo seria que essa regra estivesse dentro de algum método.

Se você pensar que sua aplicação pode usar todas essas coisas juntas com esses quilos de annotations (Seam, Hibernate, Validator, Guice, etc, etc), no final você vai ter objetos de domínio altamente acoplados à toda a infraestrutura da aplicação. Pior ainda quando essas annotations tem regras de negócio. Os objetos vão acabar se tornando meros “fantoches” controlados por annotations… Isso definitivamente não parece ser bom.

Categories
Engenharia de software Eventos

[JBoss World 2008] Emmanuel Bernard: Hibernate

JBoss World 2008 - Emmanuel Bernard - HibernateA apresentação do Emmanuel Bernard sobre Hibernate foi muito boa. Inicialmente o Gavin King também iria participar, mas ele acabou não chegando a tempo. Fiquei com medo achando que eles fossem falar sobre coisas muito básicas que todo mundo já conhece, mas ao invés disso o Emmanuel se preocupou justamente em falar sobre coisas que as pessoas não estão muito acostumadas a ver por aí, como estratégias de replicação e ResultTransformers, por exemplo.

Roadmap do Hibernate 3.x

O Emmanuel deu uma visão muito ampla do que eles planejam para o futuro. O roadmap do Hibernate para as próximas versões (3.x), que serão lançadas durante os próximos meses, incluem dentre outras coisas o seguinte:

Second-level Cache

  • Re-design das estratégias de replicação em cluster usando JBoss Cache (aliás, muito necessário, porque isso definitivamente não funciona bem, já tive experiências não muito boas de aplicações que simplemente se afogam com isso).
  • Re-design da clusterização de um modo geral.

JDBC Work API

Quando o Hibernate se torna um impecilho para o desenvolvimento porque não te dá a flexibilidade que você precisa, use um “proxy” para JDBC provido pelo Hibernate.

Stateless API

Usada para operações em batch, esta API permitirá a inserção de milhões de objetos sem erros de “out of memory”, facilitará o desenvolvimento de tarefas para rodar em intervalos de tempo determinados (tipo cron jobs) e coisas do tipo.

Hibernate 4.0

Já o Hibernate 4.0, que não tem data marcada para sair e parece que não vai ser tão cedo, tem uma lista de features muito mais extensa e “agressiva”. Basicamente essa nova versão do Hibernate será focada nos seguintes objetivos:

Facilidade de desenvolvimento

Configuração mais simples

  • Cada vez menos baseada em texto/String e xml e mais baseada em convenções e annotations.
  • Mutável em runtime, ou seja, alterar determinadas configurações não irá requerer que o contexto seja reiniciado.

Mais flexibilidade de mapeamento

  • Mais opções para mapeamento de componentes polimórficos.
  • Mais opções para mapeamento de coleções.

Otimizações

  • Melhorias no startup, que hoje é muito lento, especialmente quando se tem centenas ou milhares de entities.
  • Novas estratégias de fetching e melhorias no fetch automático.

Queries

Funcionalidades de alto nível

Versionamento automático e transparente de dados “out of the box”.

Entity Manager

Uma das idéias é que não seja mais necessário registrar as entities em um arquivo de configuração, só a annotation @Entity será necessária.

Hibernate Tools

  • Criação de Ant tasks para que toda a DDL (tabelas, constraints, sequences, etc) necessária para a aplicação funcionar seja gerada automaticamente.
  • Leitura das informações para geração de DDL diretamente das entities, suportando tanto os mapeamentos feitos com Hibernate como com JPA.
  • Integração com JBoss Developer Studio.

Ampliação da plataforma

Outros projetos mais novos como Hibernate Search, Hibernate Validator e Hibernate Shards ganharão mais foco.

E a JPA?

Tudo isso automaticamente nos remete ao assunto Java Persistence API. A JPA foi lançada com um conjunto de featues muito pequeno que simplesmente não atende qualquer caso que não seja feijão-com-arroz. O que normalmente acaba acontecendo é que você sempre tem que recorrer a features específicas do Hibernate para resolver casos mais complexos. Isso simplesmente elimina o papel da JPA, que seria manter a aplicação desacoplada de um “vendor” específico. Então, o Emmanuel também falou um pouco do que podemos esperar para a JPA para resolver esses problemas:

  • Objetivo principal: padronização de um mecanismo de mapeamento objeto-relacional “lightweight”.
  • Focada em Domain Model.
  • Uso massivo de annotations: o objetivo é fazer tudo funcionar por annotations sem a necessidade de nenhum arquivo de configuração.
  • Incorporação das annotations avançadas específicas do Hibernate.
  • Fará parte do Java EE 6 padrão.
  • Terá uma Criteria API.