Static Metamodel
O que é?
É uma maneira de representar os atributos da classe de forma, mostrando seus relacionamentos
Por que utilizar?
Pois torna as Criteria Query criadas, ainda mais TypedSafe e por esse motivo já diminui os possíveis erros de acontecerem.
Perante a minha experiencia com Criteria Query e Static Metamodel, so tive os seguintes problemas , quando à alteração do atributo de modo a trocar tipo ou trocar o seu nome. Caso o mesmo seja alterado conforme dito anteriormente, ao tentar o utilizar esse atributo do Metamodel o mesmo ira lançar uma Exceção de NullPointerException
Como criar
Para criar um Static Metamodel, deve-se ter uma Entidade, um Embeddable, uma MappedSuperclass, algo que de uma forma represente dados em uma tabela. Lembrando que a classe deve estar no Persistence Unit, para ser gerenciada pelo Provider.
Conforme exemplo abaixo:
Conforme a JSR 317, que possui a especificação da JPA, diz que para criar um metamodel, deve-se seguir os segunintes passos:
-O Static Metamodel é uma classe
-Deve ser anotada com a anotação @StaticMetamodel(javax.persistence.metamodel)
-É obrigatório estar no mesmo pacote da classe
-O nome deve ser o mesmo da classe a da qual o metamodel será criado, porem terminando com "_"
-A Nomenclatura dos atributos deve ser a mesma da classe
Conforme exemplo abaixo:
É uma maneira de representar os atributos da classe de forma, mostrando seus relacionamentos
Por que utilizar?
Pois torna as Criteria Query criadas, ainda mais TypedSafe e por esse motivo já diminui os possíveis erros de acontecerem.
Perante a minha experiencia com Criteria Query e Static Metamodel, so tive os seguintes problemas , quando à alteração do atributo de modo a trocar tipo ou trocar o seu nome. Caso o mesmo seja alterado conforme dito anteriormente, ao tentar o utilizar esse atributo do Metamodel o mesmo ira lançar uma Exceção de NullPointerException
Como criar
Para criar um Static Metamodel, deve-se ter uma Entidade, um Embeddable, uma MappedSuperclass, algo que de uma forma represente dados em uma tabela. Lembrando que a classe deve estar no Persistence Unit, para ser gerenciada pelo Provider.
Conforme exemplo abaixo:
package br.umpoucomais.entidades; /** Importações */ @Entity public class Cliente{ @Id private Long id; @Column(name = "CPF", length = 11, nullable = false) private String cpf; @Column(name = "RG", nullable = false) private String rg; @Column(name = "NOME", nullable = false) private String nome; @ElementCollection @CollectionTable(name = "DADOS_TELEFONE") @MapKeyColumn(name = "TIPO_TELEFONE") @Column(name = "TELEFONE") private Map<String, String> telefones; @ElementCollection private Set<String> emails; }
Conforme a JSR 317, que possui a especificação da JPA, diz que para criar um metamodel, deve-se seguir os segunintes passos:
-O Static Metamodel é uma classe
-Deve ser anotada com a anotação @StaticMetamodel(javax.persistence.metamodel)
-É obrigatório estar no mesmo pacote da classe
-O nome deve ser o mesmo da classe a da qual o metamodel será criado, porem terminando com "_"
-A Nomenclatura dos atributos deve ser a mesma da classe
Conforme exemplo abaixo:
package br.umpoucomais.entidades; /** Importações */ @StaticMetamodel(value = Cliente.class) public class Cliente_ { public static volatile SingularAttribute<Cliente, Long> id; public static volatile SingularAttribute<Cliente, String> cpf; public static volatile SingularAttribute<Cliente, String> rg; public static volatile SingularAttribute<Cliente, String> nome; public static volatile MapAttribute<Cliente, String, String> telefones; public static volatile SetAttribute<Cliente, String> emails; }
Uau!
ReplyDeleteCara ! Você salvou meu dia!
ReplyDeletePQP! Obg !