Dúvida sobre mapeamento Hibernate
Boa tarde,
Estamos com dúvida sobre a seguinte situação, existe a entidade Produto, no qual possui N atributos, um desses faz referencia a Unidade de Medida, no qual também possui N atributos. Quando faço uma consulta de produto, a mesma retorna automaticamente todos os atributos, inclusive os relacionamento, aqui está o problema, um desses relacionamento possui muitos atributos que é o caso da Unidade Medida, mas neste momento só será utilizado o id(PK) e a descrição da Unidade Medida. Com isso estava pesquisando alguma forma de retornar somente esses atributos. Não foi encontrado nenhuma forma "elegante" de fazer isso. Alguém tem alguma sugestão de como solucionar este caso?
Foi feito alguns testes da seguinte forma, foi criado uma classe chama UnidadeMedidaSimples, no qual possui somente a descrição e id(pk).
E foi criado uma classe chamada UnidadeMedida que estende de Unidade de Medida Simples.
Gostaria de saber se é possível utilizar a classe UnidadeMedidaSimples como uma entidade, porque neste caso seria utilizada a mesma no relacionamento com Produto e não UnidadeMedida, ou seja, quando for necessário todos os atributos faz o relacionamento direto com UnidadeMedida. Mas vocês podem pensar porque ele não faz logo duas classe mapeada diretamente, que resolveria este caso. Mas neste caso existiria duplicidade de código, no qual ficaria mais complexo para dar manutenção.
Espero que tenham entendido a dúvida.
Desde já obrigado.
Estamos com dúvida sobre a seguinte situação, existe a entidade Produto, no qual possui N atributos, um desses faz referencia a Unidade de Medida, no qual também possui N atributos. Quando faço uma consulta de produto, a mesma retorna automaticamente todos os atributos, inclusive os relacionamento, aqui está o problema, um desses relacionamento possui muitos atributos que é o caso da Unidade Medida, mas neste momento só será utilizado o id(PK) e a descrição da Unidade Medida. Com isso estava pesquisando alguma forma de retornar somente esses atributos. Não foi encontrado nenhuma forma "elegante" de fazer isso. Alguém tem alguma sugestão de como solucionar este caso?
Foi feito alguns testes da seguinte forma, foi criado uma classe chama UnidadeMedidaSimples, no qual possui somente a descrição e id(pk).
@MappedSuperclass
public class UnidadeMedidaSimples implements Serializable {
@Id
@SequenceGenerator(name="UNIDADE_CODIGOINTERNO_GENERATOR", sequenceName="ESCRITA.SEQ_UNIDADE", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="UNIDADE_CODIGOINTERNO_GENERATOR")
@Column(name="co_unidade")
private Integer codigoInterno = 0;
@Column(name = "no_unidade")
@NotBlank(message = "{validacao.unidademedida.descricao.blank}")
@Size(max = 20, message = "{validacao.unidademedida.descricao.size}")
private String descricao;
E foi criado uma classe chamada UnidadeMedida que estende de Unidade de Medida Simples.
@Entity
@Table(schema = "escrita", name = "unidade")
@Inheritance
public class UnidadeMedida extends UnidadeMedidaSimples implements Serializable {
@Column(name = "sigla")
private String sigla;
@Column(name = "fator_conversao")
private String fator;
@Column(name = "fator_conversao1")
private String fator;
@Column(name = "fator_conversao2")
private String fator;
//mais N atributos abaixo
Gostaria de saber se é possível utilizar a classe UnidadeMedidaSimples como uma entidade, porque neste caso seria utilizada a mesma no relacionamento com Produto e não UnidadeMedida, ou seja, quando for necessário todos os atributos faz o relacionamento direto com UnidadeMedida. Mas vocês podem pensar porque ele não faz logo duas classe mapeada diretamente, que resolveria este caso. Mas neste caso existiria duplicidade de código, no qual ficaria mais complexo para dar manutenção.
Espero que tenham entendido a dúvida.
Desde já obrigado.
Pti Ltda
Curtidas 0
Respostas
Daniel Volpato
06/06/2014
Boa noite Pti,
Tirando as regras do negócio, talvez isso aqui possa te ajudar.
Também procure sobre classes embutidas (@Embeddable e @Embedded).
Tirando as regras do negócio, talvez isso aqui possa te ajudar.
Também procure sobre classes embutidas (@Embeddable e @Embedded).
GOSTEI 0
Pti Ltda
06/06/2014
Olá, Obrigado pelo retorno.
No caso do @Embeddable tudo que está mapeado é retornar no objeto "PAI", no qual cairia na mesma situação. Nunca havia utilizado a anotação @Basic, fiz o mapeamento com a mesma, mas continua retornando o atributo mesmo mapeado. Você sabe me informar se existe alguma outra regra para este caso?
Att.
No caso do @Embeddable tudo que está mapeado é retornar no objeto "PAI", no qual cairia na mesma situação. Nunca havia utilizado a anotação @Basic, fiz o mapeamento com a mesma, mas continua retornando o atributo mesmo mapeado. Você sabe me informar se existe alguma outra regra para este caso?
Att.
GOSTEI 0
Daniel Volpato
06/06/2014
Então seria melhor utilizar uma view pra essa tua situação.
(1)Você pode criar na tua base de dados ,ou (2) apenas uma classe que represente essa view (sem criar na base de dados)
no caso 2 o Jpa provê essa funcionalidade - pesquise sobre select new do jpql,
aqui tem um exemplo
fugindo um pouco do assunto, vale a pena repensar no que diz respeito a herança que você está usando, não que a herança seja ruim, mas dê preferência a composição
(1)Você pode criar na tua base de dados ,ou (2) apenas uma classe que represente essa view (sem criar na base de dados)
no caso 2 o Jpa provê essa funcionalidade - pesquise sobre select new do jpql,
aqui tem um exemplo
fugindo um pouco do assunto, vale a pena repensar no que diz respeito a herança que você está usando, não que a herança seja ruim, mas dê preferência a composição
GOSTEI 0