Estou com o seguinte problema após a última aula, a qual converte a Categoria em chave composta:
Exception in thread "main" java.lang.ExceptionInInitializerError
at br.com.alura.loja.testes.PerformanceConsultas.popularBancoDeDados(PerformanceConsultas.java:54)
at br.com.alura.loja.testes.PerformanceConsultas.main(PerformanceConsultas.java:18)
Caused by: org.hibernate.AnnotationException: A Foreign key referring br.com.alura.loja.modelo.Categoria from br.com.alura.loja.modelo.Produto has the wrong number of column. should be 2
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:639)
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:103)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1881)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1825)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1732)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:300)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1350)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1421)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:55)
at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:80)
at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at br.com.alura.loja.util.JPAUtil.<clinit>(JPAUtil.java:9)
... 2 more
package br.com.alura.loja.modelo;
@Entity
@Table(name = "produtos")
@NamedQuery(name = "Produto.produtosPorCategoria", query = "SELECT p FROM Produto p WHERE p.categoria.id.nome = :nome")
@Inheritance(strategy = InheritanceType.JOINED)
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class Produto {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
private String descricao;
private BigDecimal preco;
@Column(name = "data_cadastro")
private LocalDate dataCadastro = LocalDate.now();
@Enumerated(EnumType.STRING)
@Column(name = "categoria_enum")
private CategoriaEnum categoriaEnum;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "categoria_id")
private Categoria categoria;
public Produto(String nome, String descricao, BigDecimal preco, CategoriaEnum categoriaEnum, Categoria categoria) {
this.nome = nome;
this.descricao = descricao;
this.preco = preco;
this.categoriaEnum = categoriaEnum;
this.categoria = categoria;
}
@Override
public String toString() {
return "Produto{" +
"id=" + id +
", nome='" + nome + '\'' +
", descricao='" + descricao + '\'' +
", preco=" + preco +
", dataCadastro=" + dataCadastro +
", categoriaEnum=" + categoriaEnum +
", categoria=" + categoria +
'}';
}
}
package br.com.alura.loja.testes;
import java.math.BigDecimal;
import java.util.List;
public class CadastroDeProduto {
public static void main(String[] args) {
cadastrarProduto();
EntityManager em = JPAUtil.getEntityManager();
ProdutoDAO produtoDao = new ProdutoDAO(em);
Produto p = produtoDao.buscarPorId(1L);
System.out.println(p.getPreco());
List<Produto> todos = produtoDao.buscarPorNomeDaCategoria("CELULARES");
todos.forEach(p2 -> System.out.println(p.getNome()));
BigDecimal precoDoProduto = produtoDao.buscarPrecoPorId(1L);
System.out.println("Preco do Produto: " +precoDoProduto);
}
private static void cadastrarProduto() {
EntityManager em = JPAUtil.getEntityManager();
ProdutoDAO produtoDAO = new ProdutoDAO(em);
CategoriaDAO categoriaDAO = new CategoriaDAO(em);
Categoria celulares = new Categoria("CELULARES");
Produto celular = new Produto("Xiaomi Redmi", "Topper", new BigDecimal("800"), CategoriaEnum.CELULARES, celulares);
em.getTransaction().begin();
categoriaDAO.cadastrar(celulares);
produtoDAO.cadastrar(celular);
em.getTransaction().commit();
// Chave composta
em.find(Categoria.class, new CategoriaID("CELULARES", "xpto"));
em.close();
}
}