Olá pessoal… tudo bem??
Estou começando a mexer com JPA e logo de cara tive um problema com relacionamento OneToMany e ManyToOne…
Estou desenvolvendo uma aplicação simples para venda de produtos. Na minha análise para resolver o que precisava criei 3 classes que solucionariam meu problema: Produto.java; Compra.java e ItensCompra.java…
A parte CRUD do Produto.java funciona perfeitamente… meu problema está no relacionamento da venda do produto… Não consigo persistir meu registro de venda…
Farei o que, registrarei na tabela de compra uma nova compra e na tabela de Itens de Compra, os itens que aquela determinada venda teve, referenciando tbm o produto que foi comprado e que estará armazenado numa tabela de registros dos produtos…
Minhas tabelas estão assim:
create table tb_produto
(
id int identity,
nome_prod varchar(100) not null,
descricao_prod varchar(100),
valor_prod decimal(4,2) not null,
qtde_prod int not null,
constraint pk_produto primary key(id)
)
create table tb_compra
(
id int identity,
valortotal_compra decimal(5,2) not null,
aluno_compra int,
constraint pk_compra primary key(id),
constraint fk_aluno_compra foreign key(aluno_compra) references tb_aluno(id),
)
create table tb_itenscompra
(
id int identity,
compra_itens int,
produto_itens int,
qtde_itens int,
valortotal_itens decimal(5,2),
constraint pk_itenscompras primary key(id),
constraint fk_produto_itens foreign key(produto_itens) references tb_produto(id),
constraint fk_compra_itens foreign key(compra_itens) references tb_compra(id),
)
e minhas classes mapeei da seguinte forma:
@Entity
@Table(name="tb_produto")
public class Produto implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name="nome_prod")
private String nomeProduto;
@Column(name="descricao_prod")
private String descricaoProduto;
@Column(name="valor_prod")
private BigDecimal valorProduto;
@Column(name="qtde_prod")
private int qtdeProduto;
//getters and setters
}
@Entity
@Table(name="tb_compra")
public class Compra implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
//private Aluno aluno;
//@Column(name="valortotal_compra")
//private BigDecimal valorTotalCompra;
@OneToMany(mappedBy="compra",cascade=CascadeType.ALL,fetch= FetchType.EAGER)
private List<ItensCompra> itensCompra = new ArrayList<ItensCompra>();
// getters and setters
}
@Entity
@Table(name="tb_itenscompra")
public class ItensCompra implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinColumn(name="compra_itens")
private Compra compra;
@OneToOne(cascade= CascadeType.ALL,fetch= FetchType.EAGER)
@JoinColumn(name="produto_itens")
private Produto prod;
@Column(name="qtde_itens")
private int qtde;
@Column(name="valortotal_itens")
private BigDecimal valorTotal;
//getters and setters
}
quando chamo o método para popular e persistir
private void registrarVenda() {
Compra c = new Compra();
int cont = 0;
try {
for(Produto p : listaProdutos) {
ItensCompra item = new ItensCompra(c);
item.setProd(p);
item.setQtde(listaQtdes.get(cont));
item.setValorTotal(listaValoresTotaisItens.get(cont));
c.getItensCompra().add(item);
}
new CompraControle().salvar(c);
}catch(Exception e) {
JOptionPane.showMessageDialog(null, "ERRO AO REGISTRAR COMPRA\n"
+ e.getMessage(), "FALHA", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}
tenho o seguinte erro:
java.lang.IllegalArgumentException: Object: jr7.lojaescolar.entidades.Compra[ id=null ] is not a known entity type.
Jah segui orientação de vários materiais que encontrei na internet e nada de solucionar esse problema… Debuguei o código que o objeto de compra chega todo populado na DAO antes de persistir…
Meu persistence.xlm está assim:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="BibliotecaLojaEscolarPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>jr7.lojaescolar.entidades.Aluno</class>
<class>jr7.lojaescolar.entidades.Produto</class>
<class>jr7.lojaescolar.entidades.ItensCompra</class>
<class>jr7.lojaescolar.entidades.Compra</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost\db_lojaescolar:1433;databaseName=db_lojaescolar"/>
<property name="javax.persistence.jdbc.password" value="xxxxxxxxx"/>
<property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="javax.persistence.jdbc.user" value="xxxxxx"/>
</properties>
</persistence-unit>
</persistence>
saberiam o que estou fazendo de errado nesse mapeamento??
desde já agradeço.
att.
Junior