Não estou conseguindo fazer um Criteria que funcione para o meu problema e depois de muito pesquisar, estou pedindo uma ajuda a vocês.
No meu banco de Dados eu tenho uma tabela de Produtos e uma tabela de Composição dos Produtos, onde a Composição é uma relação muitos para muitos da tabela de Produtos para ela mesma.
Explicando melhor; Um Produto é composto por nenhum ou é composto por vários outros produtos. Assim a tabela composição tem um campo que é o produtoId e o campo itemId formando a chave primária. Tanto produtoId, quanto itemId , são chave estrangeira da tabela de Produtos.
Segue abaixo o mapeamento das tabelas:
@Entity
@Table(name = "TabComposicao")
public class Composicao {
@EmbeddedId
private ComposicaoPk composicaoPk;
private double quantidade;
// getters and setters
}
Classe Chave primária para tabela Composição
@Embeddable
public class ComposicaoPk implements Serializable{
private static final long serialVersionUID = 1L;
@ManyToOne
@JoinColumn(name="produtoId")
private Produto produto;
@ManyToOne
@JoinColumn(name="itemId")
private Produto item;
// getters and setters
}
Eu preciso de criar Criteria do objeto Composição com restrição a um dado Produto, para que sejam listados todos os itens que compõem o Produto em questão.
Abaixo segue uma das tentativas que não funcionaram:
public List<Composicao> tableList(int primeiro, int quantidade, Produto produto){
Criteria c = session.createCriteria(persistentClass);
c.createAlias("produto", "prod");
c.add(Restrictions.eq("prod.produto", produto));
c.setFirstResult(primeiro);
c.setMaxResults(quantidade);
return c.list();
}
Desde já fico muito agradecido aos usuários do GUJ.
Não sei se entendi certo, mas não entendi o seu mapeamento da maneira como você comentou.
Um Produto tem uma composição, que pode ter subprodutos. E esse relacionamento ocorre na PK da composição.
Então seria produto.composicao onde composição seriam muitas (relacionadas pelo produtoId), e daí você pegaria dentro de cada um o id do item?? É isso ou entendi errado?
E você que a lista de produtos que compõe o produto que você passou, não é? Não entendi o retorno da sua query como um objeto composição.
Em primeiro lugar, muito obrigado pelo interesse. Eu tenho apanhado muito do java nesses últimos três meses. É difícil ter que aprender sozinho 4 frameworks java, além de HTML e CSS, depois de estar a mais de 8 anos sem programar uma linha de código… acho até estou indo bem… rsrsrsrsrs
Você entendeu direitinho o modelo relacional e a tranposição para o modelo de objetos.
Um produto é composto de nenhum ou vários subprodutos, onde na chave primária de composição temos o Id de produto e o Id do item de composição. É uma relação muitos para muitos de produto com ela mesma.
Eu consegui fazer a coisa funcionar da seguinte maneira:
public List<Composicao> tableList(int primeiro, int quantidade, Produto produto){
Criteria c = session.createCriteria(persistentClass);
c.add(Restrictions.eq("composicaoPk.produto.produtoId", produto.getProdutoId()));
c.setFirstResult(primeiro);
c.setMaxResults(quantidade);
return c.list();
}
Eu retirei o createAlias para composicaoPk e coloquei o caminho para o campo de no criteria. Isso funciona… porém eu não consigo colocar ordenação pelo código do item no resultado do meu criteria.
Isso também não é um grande problema para agora, que eu estou fazendo a camada de apresentação. Pois o modelo industrial de granularidade recursiva, como é o caso que eu estou propondo, um produto é composto de poucos subprodutos.
Isso só vai ser problema nos relatórios de planejamento de produção que vão ser implementados mais tarde. (Já apontei isso como risco no gerenciamento do projeto)
Mudando de assunto… Eu estou pensando em abrir esse meu projeto como opensource. É um sistema MRP, Manufacture Resource Plain, Sistema de planejamento de manufatura.
O sistema está sendo construído em JEE, JSF 2.0, Primefaces e Hibernate, para qualquer banco de dados OS ou de mercado. Basicamente integra processos de chão de fábrica e operações administrativas, para atender indústrias de pequeno e médio porte, como é o caso do OpenBravo, só que com uma abordagem voltada para realidade das indústrias brasileiras e uma interface mais objetiva e menos poluída.
O que você acha da idéia de abrir esse projeto, tal como foi feito com o OpenBravo?