Problema ao criar tabelas no banco com toplink

2 respostas
Silas_Rodrigues

Galera, estou fazendo um programa simples que é o de uma loja que possui produtos (relacionamento entre lojas e produtos, onde há um relacionamento bidirecional). A meu vê fiz o código todo certo, pelo menos eu não encontrei erro algum. Usei até o modo debug e não achei aonde estaria o problema.

Segue os fontes:

classe Loja:

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Loja {
	
	@Id
	String nome;
	
	@OneToMany(mappedBy="loja", cascade = CascadeType.ALL)
	List<Produto> produtos = new ArrayList<Produto>();
	
	public Loja() {
		
	}
	
	public Loja(String nome, List<Produto>produtos) {
		
		this.nome = nome;
		this.produtos = produtos;
		
	}
	
	public void setNome(String nome) {
		
		this.nome = nome;
		
	}

	public String getNome() {
		
		return this.nome;
		
	}

	public List<Produto> getProdutos() {
		
		return produtos;
		
	}

	public void setProdutos(List<Produto> produtos) {
		 
		this.produtos = produtos;
		
	}
	
}

Classe Produto:

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

@Entity 		
public class Produto {
	
	@Id		 
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;
	private String nome;
	private double preco;
	private int estoque;
	private String descricao;
	
	@ManyToOne
	Loja loja;
	
	public Produto() {
		
	}
	
	public Produto(String nome, double preco, int estoque, String descricao) {
		
		this.nome = nome;
		this.preco = preco;
		this.estoque = estoque;
		this.estoque = estoque;
		
	}

	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;
		
	}

	public double getPreco() {
		
		return preco;
		
	}

	public void setPreco(double preco) {
		
		this.preco = preco;
		
	}

	public int getEstoque() {
		
		return estoque;
		
	}

	public void setEstoque(int estoque) {
		
		this.estoque = estoque;
		
	}

	public String getDescricao() {
		
		return descricao;
		
	}

	public void setDescricao(String descricao) {
		
		this.descricao = descricao;
		
	}
	
	public Loja getLoja() {
		
		return loja;
		
	}

	public void setLoja(Loja loja) {
		
		this.loja = loja;
		
	}

	public String toString() {
		
		return id + " --- " + nome + " --- " + " --- " + preco + " --- " + estoque + " --- " + descricao;
	
	}
	
}

Aplicação:

import java.util.List;
import java.util.ArrayList;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class Aplicacao1 {
	
	EntityManagerFactory factory;
	EntityManager manager;
	List<Loja> lojas = new ArrayList<Loja>();
	List<Produto> produtos = new ArrayList<Produto>();
	
	public Aplicacao1(){
		
		factory = Persistence.createEntityManagerFactory("lojas");
		manager = factory.createEntityManager();
		
		cadastrarLojas();

		manager.close();
		factory.close();
		
	}
	
	public void cadastrarLojas() {
		
		manager.getTransaction().begin();
		
		produtos.add(new Produto("prod1", 1.99, 8, ""));
		produtos.add(new Produto("prod2", 4.99, 9, ""));
		produtos.add(new Produto("prod3", 7.99, 10, ""));
		
		lojas.add(new Loja("loja1", produtos));
		
		for (Produto p: produtos) {
			
			p.setLoja(lojas.get(0));
			
		}
		
		manager.persist(lojas);
		manager.flush(); 	
		manager.getTransaction().commit();
		
	}
	
	
	public static void main(String[] args) {
		
		new Aplicacao1();
		
	}

}

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

	<persistence-unit name="lojas">
	
		<provider>
			oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider
		</provider>
		
		<!-- INSERIR AQUI TODAS AS CLASSSES PERSISTENTES -->
		<class>Produto</class>	
		<class>Loja</class>

		<!--  USANDO MYSQL  -->	
		
		<properties>
			<property name="toplink.jdbc.driver" 	value="com.mysql.jdbc.Driver" />
			<property name="toplink.jdbc.url" 		value="jdbc:mysql://127.0.0.1:3306/loja" />
			<property name="toplink.jdbc.user" 		value="root" />				
			<property name="toplink.jdbc.password" 	value="admin" />
			<property name="toplink.logging.level"  value="info" />   
			<property name="toplink.ddl-generation" value="create-tables" />	
		</properties>
			
	</persistence-unit>
	
</persistence>

O problema quando rodo a aplicação é o seguinte:

Exception in thread “main” java.lang.IllegalArgumentException: Object: [Loja@6c585a] is not a known entity type.

É como que a entidade loja não fosse conhecida, mas acho que fiz ela certinha. Quem puder encontrar o erro, agradeceria! :smiley:

Vlw!

2 Respostas

diegowh

Você tá tentando salvar a lista de lojas ao invés de cada loja.
Faz um foreach percorrendo a lista e dentro dá persist em cada loja.
:smiley:

Silas_Rodrigues

Vaaaaaleu, Diego!

Era isso mesmo. Probleminha que eu num tava detectando.

\o

Criado 14 de abril de 2010
Ultima resposta 15 de abr. de 2010
Respostas 2
Participantes 2