Olá.
Escrevendo o post Java + MongoDB + Spring Data descobri o Spring Data JPA
e fiquei surpreso em descobrir algumas features como a criação de repositórios e consultas dinâmicas.
Neste Post vou falar um pouco sobre o Spring Data JPA e como ele pode lhe proporcionar uma maneira rápida e elegante de implementar seus repositórios.
O Spring Data JPA tem como principal objetivo facilitar a implementação das camadas de acesso a dados.
O Spring fica responsável pela implementação dos repositórios e oferece algumas funcionalidades sofisticadas e comuns na maioria dos CRUDs baseado na entidade que esta sendo gerenciada.
Nessa aplicação vou usar as entidades Contact, Phone, e o repositório ContactRepository.
As entidades são bem simples, é anotadas com o mapeamento de seus atributos e relacionamentos.
Contact.java
@Entity @Table(name="phones") public class Phone @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @ManyToOne @JoinColumn(name="id_contact") private Contact contact; //getter and setter methods ...
Phone.java
@Entity @Table(name="contacts") public class Contact @Id @Column(name="id_contact") @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(name="name") private String name; @Column(name="email",unique=true) private String email; @OneToMany(mappedBy="contact",cascade=CascadeType.ALL, fetch=FetchType.LAZY) @Fetch(FetchMode.JOIN) @private Set<Phone> phones = new HashSet<Phone>(); //getter and setter methods ...
ContactRepository.java
public interface ContactRepository extends JpaRepository<Contact, Long> public Contact findByEmail(String email);
Até aqui nada de novo, porem agora como a “mágica” do Spring JPA ..rsrs
A interface do repositório estende JpaRepository, essa interface tem alguns métodos comuns como findAll, findOne, save, delete, etc…
Normalmente teríamos que implementar essa interface criando uma classe ContactRepositoryImpl e registra-la como um bean do spring
para que então possamos utilizar o repositório.
Com o Spring JPA não é necessário escrever essa implementação
..
Não é magia meus amigos, é tecnologia !!!…rsrs
O Spring JPA vai procurar por interfaces de repositórios que estendam a interface JpaRepository,
e então criar uma implementação para a interface e registra-la como um bean.
Para isso so é necessário apenas adicionar a tag jpa:repositories no contexto do spring,
com isso o Spring sabe onde procurar os repositórios que ele teve implementar.
applicationContext.xml
// Declaração dos Beans, TransactionManager, DataSource, etc...
base-package="br.com.flexria.springjpa.repository" />
Com isso a implementação do repositório já esta pronta para ser injetada é utilizada na aplicação.
@Autowired ContactRepository repository; repository.save(contact); repository.delete(contact); List<Contact> list = contactRepository.findAll();
Isso por si so ja é algo incrível so que o Spring Data JPA vai alem.
Algo que ja é comum no Rails, são os Dynamic attribute-based finders que é a possibilidade de realizar buscas dinâmica baseadas nos atributos do objeto
Em rails temos :
//"SQL : SELECT * FROM contacts WHERE email = 'fabio.bat.silva@gmail.com'" Contact.where(:email =>"fabio.bat.silva@gmail.com") //Usando Dynamic attribute-based finders Contact.find_by_email "fabio.bat.silva@gmail.com"
É exatamente isso que o Spring Data JPA faz,
além de implementar do repositório com ele é possível utilizar buscas dinâmica baseadas nos atributos do objeto.
// HQL : select c from Contact c where c.email = ?1 public Contact findByEmail(String email); // HQL : select c from Contact c where c.name like ?1 public List<Contact> findByNameLike(String name);
Com base em algumas palavras chaves varias consultas podem ser feitas :
Leia o resto aqui.




