7
respostas

Como apresentar atributo de um modelo em um select

Eu criei 2 modelos, Produto e Estoque;

A tabela produto armazena vários produtos (itens).

A tabela estoque armazena o nome, id e a quantidade de um produto.

Como faço pra chamar os itens da tabela produto na tabela estoque e linkar, de forma que se for feita algum alteração no atributo nome, seja alterado nas duas tabelas.

7 respostas

Oi Thiago, meu conselho é que você faça os cursos de JPA aqui da alura, as respostas para essa dúvida está nos cursoss.. a coisa mais importante é que você vai começar a pensar em classes e não em tabelas.

Eu me referi ao banco quando disse tabela. Sei que Produto e Estoque são classes. Eu não entendi como fazer para relacionar o EstoqueDao com o ProdutoDao, essa conversa, quais anotações devo fazer nas classes ou como fazer a chamada no método adiciona do EstoqueController.

Opa, em geral não vai ter relação entre o ProdutoDao e o EstoqueDao... o que você vai fazer é chamar métodos em ambos para completar a sua operação de criar um pedido. Exemplo:

Produto produto = produtoDao.find(idProduto);
estoqueDao.abate(produto,2);

e por aí vai.

Não entendi esse método abate. Pode explicar melhor?

Controller

@Controller
public class EstoqueController {

    private EstoqueDao estoqueDao;
    private ProdutoDao produtoDao;
    private Result result;

    @Inject
    public EstoqueController(EstoqueDao estoqueDao, ProdutoDao produtoDao, Result result) {
        this.estoqueDao = estoqueDao;
        this.produtoDao = produtoDao;
        this.result = result;
    }    

    public EstoqueController() {}

    public void form() {}

    public void lista() {
        List<Produto> produtos = produtoDao.lista();
        result.include("produtos",produtos);
    }    

}

Dao

@RequestScoped
public class EstoqueDao {

    private EntityManager manager;

    @Inject
    public EstoqueDao (EntityManager manager){
        this.manager = manager; 
    }

    public EstoqueDao(){}

    public List<Produto> lista() {
        TypedQuery<Produto> query = manager.createQuery("select u from Produto u", Produto.class);
        return query.getResultList();
    }

}

Modelo

@Entity
public class Estoque implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @NotEmpty
    private String nome;

    @NotNull
    @Min(0)
    private int quantidade;

    public int getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(int quantidade) {
        this.quantidade = quantidade;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

}

Chamada na jsp:

    <select>
        <c:forEach items="${produtos}" var="produto">
            <option>${produto.nome}</option>
        </c:forEach>
    </select>

Eu sei que tem algum erro grosseiro, espero sua resposta.

Será que é necessário trabalhar com herança, usando o ManyToOne no Produto.class e o OneToMany no Estoque.class??? Precisa mexer no Dao???

Não vi nenhum erro grosseiro :). No estoque seria interessante ter um atributo do tipo produto, com @ManyToOne, para você saber de qual produto o estoque ta tratando. O método abate foi só um exemplo se você quisesse diminuir a quantidade do estoque no banco.