Ajuda para Salvar Produtos

Qdo vc tentar algo e não funcionar, poste aqui como vc tentou, pq talvez seja apenas algum detalhe que faltou. E não dá para saber o que indicar para vc fazer, sem saber o que vc já tentou.

Isso é complicado, pq a modelagem iria te dá uma melhor ideia das coisas e ajudar no mapeamento. Um modelo assim, por exemplo:

[Venda] -> [ProdutoVenda] <- [Produto]
 - cod  |   - codVenda     |  - cod
        |   - codProduto   |

Esse seria um @ManyToMany, ou seja, uma venda possui vários produtos, e um mesmo produto pode ser de várias vendas. Essa modelagem resolveria o que vc está tentando fazer. Mas para isso, a tabela ProdutoVenda teria que está criada no banco de dados e o mapeamento @ManyToMany teria que ser feita da forma correta.

Particularmente, não gosto de usar a anotação @ManyToMany, prefiro ter uma classe para representar o ProdutoVenda e mapear com @OneToMany, pois fica mais flexível.

1 curtida

@Lucas_Camara

Então, eu criei uma classe chamada ProdutoVendido:

package br.com.fjsistemas.backend;

import javax.persistence.Entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class ProdutoVendido {
	
	private String produto;
	private String qtd;
	
} 

só coloquei 2 parâmetros

mas quando tento rodar da este stack:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: No identifier specified for entity: br.com.fjsistemas.backend.ProdutoVendido
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1788) ~[spring-beans-5.3.3.jar:5.3.3]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609) ~[spring-beans-5.3.3.jar:5.3.3]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.3.jar:5.3.3]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.3.jar:5.3.3]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.3.jar:5.3.3]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.3.jar:5.3.3]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.3.jar:5.3.3]
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159) ~[spring-context-5.3.3.jar:5.3.3]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) ~[spring-context-5.3.3.jar:5.3.3]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.3.jar:5.3.3]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) ~[spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) ~[spring-boot-2.4.2.jar:2.4.2]
	at br.com.fjsistemas.Application.main(Application.java:11) ~[classes/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]
	at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.2.jar:2.4.2]
Caused by: org.hibernate.AnnotationException: No identifier specified for entity: br.com.fjsistemas.backend.ProdutoVendido
	at org.hibernate.cfg.InheritanceState.determineDefaultAccessType(InheritanceState.java:266) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
	at org.hibernate.cfg.InheritanceState.getElementsToProcess(InheritanceState.java:211) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
	at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:781) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
	at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:248) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:239) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:282) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.3.jar:5.3.3]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.3.jar:5.3.3]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.3.jar:5.3.3]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.3.jar:5.3.3]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.3.jar:5.3.3]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1847) ~[spring-beans-5.3.3.jar:5.3.3]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) ~[spring-beans-5.3.3.jar:5.3.3]
	... 22 common frames omitted

e acabo não conseguindo criar esta tabela no sql

@Lucas_Camara

o stack eu arrumei, tinha esquecido de por um id

entao tenho esta classe ProdutoVendido:

package br.com.fjsistemas.backend;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class ProdutoVendido {
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	private String produto;
	private String qtd;
	
} 

mas não sei o que fazer agora…rs

Do jeito que vc fez a classe ProdutoVendido, como vc vai saber de qual venda o produto vendido se refere? E como vc vai saber qual é o produto?

1 curtida

@Lucas_Camara

a vdd é que eu não sei…rs

estou começando a programar…então vou aprendendo conforme vou conseguindo fazer as etapas, cada etapa é um aprendizado…agora vou pesquisar como fazer essa ligação que vc mencionou

Nessa classe ProdutoVendido, tu tem que mapear a Venda e o Produto. Com isso, vc conseguirá manter uma lista de produtos vendidos na classe Venda.

1 curtida

Achei um exemplo que eh exatamente a sua situação: https://www.codejava.net/frameworks/hibernate/hibernate-many-to-many-association-with-extra-columns-in-join-table-example

Vc iria ter 3 classes: Venda, ProdutoVenda e Produto, onde:

Venda possui uma lista de ProdutoVenda (@OneToMany)
Com isso vc conseguiria saber os produtos de uma venda

ProdutoVenda possui a Venda (@ManyToOne) e o Produto (@ManyToOne)
Com isso vc iria relacionar os produtos à venda, e um mesmo produto poderia ser de várias Vendas

1 curtida

Na sua tela, qdo vc está incluíndo um Produto à uma Venda, esse produto já está cadastrado no banco?

1 curtida

@Lucas_Camara

sim, quando vou para tela de vendas, para realizar a venda, quando vou selecionar o Produto que será vendido, o mesmo se encontra salvo no banco

Certo. Então vc poderia ter um método na sua classe Venda assim:

public class Venda {
	
	// outras propriedades
	
	@OneToMany(cascade = PERSIST) // dá uma pesquisada em como fazer o cascade 
	private List<ProdutoVenda> produtos = new ArrayList<>();
	
	public void addProduto(Produto produto) {
		ProdutoVenda produtoVenda = new ProdutoVenda(this, produto);
		produtos.add(produtoVenda);
	}
}
1 curtida

@Lucas_Camara

ou assim?:

Do primeiro jeito, pois vc precisa passar a Venda e o Produto ao criar o ProdutoVenda.

Lembre de criar um construtor na classe ProdutoVenda que receba a Venda e o Produto.

obs.: Evite ao máximo mandar imagens aqui, isso não ajuda. Sempre copie a parte do código em questão e cole aqui.

1 curtida

@Lucas_Camara

Então ficou assim:

Classe ProdutoVenda:

package br.com.fjsistemas.backend;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Venda {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;

	private LocalDate dataVenda = LocalDate.now();
	
	@ManyToOne
	private Cliente cliente;
	
	private String valorTotalVenda;
	
	@OneToMany(mappedBy = "produto", cascade = CascadeType.PERSIST)
	private List<ProdutoVenda> produtos = new ArrayList<>();
	
	public void addProduto(Produto produto) {
		ProdutoVenda produtoVenda = new ProdutoVenda(this, produto);
		produtos.add(produtoVenda);
	}

} 

Certo até aqui?

1 curtida

Aparentemente, está certo.

1 curtida

@Lucas_Camara

Veja como está as outras:

Classe Venda:

package br.com.fjsistemas.backend;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Venda {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;

	private LocalDate dataVenda = LocalDate.now();
	
	@ManyToOne
	private Cliente cliente;
	
	private String valorTotalVenda;
	
	@OneToMany(mappedBy = "produto", cascade = CascadeType.PERSIST)
	private List<ProdutoVenda> produtos = new ArrayList<>();
	
	public void addProduto(Produto produto) {
		ProdutoVenda produtoVenda = new ProdutoVenda(this, produto);
		produtos.add(produtoVenda);
	}

}

Classe Produto

package br.com.fjsistemas.backend;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Produto {
	

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	private String nome;
	private String marca;
	private String modelo;
	private Double valor;
	
	

}

Classe PRodutoVenda

package br.com.fjsistemas.backend;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class ProdutoVenda {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	
	private String produto;
	private String qtdVendida;
	
}

Agora vc precisa mapear a Venda e o Produto na classe ProdutoVenda (veja a classe UserGroup no link que mandei).

1 curtida

@Lucas_Camara

Assim?

package br.com.fjsistemas.backend;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class ProdutoVenda {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;

	private Venda venda;
	private Produto produto;

}

Sim, mas falta as anotações (veja o link que passei)

1 curtida