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 !