[RESOLVIDO] [eclipselink] Inserir valores na tabela com JPA

11 respostas
felipeaqueiroz

Bom dia,
Estou estudando JPA com eclipselink e, para testar estou usando essas classes:

@Entity
@NamedQuery(name = Item.LISTAR_TODOS, query="select i from Item i")
public class Item {
	public static final String LISTAR_TODOS = "Item.findAll";
	
	@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
	private int codigo;
	private String nome;
	private double preco;
	
	//Construtores, Getters e Setters		
}
public class ItemDAO implements DAO<Item> {

	@Override
	public void insert(Item obj) {
		EntityManager em = ConnectionFactory.getEntityManager();
		EntityTransaction tx = em.getTransaction();
		tx.begin();
		em.persist(obj);
		tx.commit();
		em.close();
	}

	@Override
	public List<Item> list() {
		EntityManager em = ConnectionFactory.getEntityManager();
		TypedQuery<Item> query = (TypedQuery<Item>) em.createNamedQuery(Item.LISTAR_TODOS);
		List<Item> itens = query.getResultList();
		em.close();
		return itens;
	}

}
Mas na hora de inserir
public class TesteInsercaoItem {

	public static void main(String[] args) {
		Item item = new Item();
		item.setNome("Item de teste 1");
		item.setPreco(1.0);
		ItemDAO dao = new ItemDAO();
		dao.insert(item);
		List<Item> itens = dao.list();
		for (Item i : itens) {
			System.out.println(i);
		}
	}

}

Se eu rodar esse teste mais uma vez, ele só aparece o último registro inserido. Mesmo olhando no console do mysql, só aparece um registro gravado. Já tentei até criar outro objeto Item e persistir. Ainda só é mostrado um objeto na lista.

Item [codigo=1, nome=Item de teste 1, preco=1.0]

Vocês sabem dizer no que eu estou errando?

Obrigado pela ajuda.

11 Respostas

Hebert_Coelho

Mas você manda inserir apenas um cara… dao.insert(item); :shock:

felipeaqueiroz

Sim, sim :smiley:
Mas já rodei essa classe com outros valores, criando dois e três objetos Item e ainda assim só retorna o último

Hebert_Coelho

Sim, sim :smiley:
Mas já rodei essa classe com outros valores, criando dois e três objetos Item e ainda assim só retorna o últimoColoca um exemplo do Main onde realmente acontece o erro? Pq nesse aí que você colocou não tem erro algum.

felipeaqueiroz
Hebert Coelho:
felipeaqueiroz:
Hebert Coelho:
Mas você manda inserir apenas um cara... dao.insert(item); :shock:
Sim, sim :D Mas já rodei essa classe com outros valores, criando dois e três objetos Item e ainda assim só retorna o último
Coloca um exemplo do Main onde realmente acontece o erro? Pq nesse aí que você colocou não tem erro algum.
Então, se eu mudo os valores para
public static void main(String[] args) {
		Item item = new Item();
		item.setNome("Item de teste 2");
		item.setPreco(2.0);
		ItemDAO dao = new ItemDAO();
		dao.insert(item);

		
		List<Item> itens = dao.list();
		for (Item i : itens) {
			System.out.println(i);
		}
	}

ele retorna isso

Item [codigo=1, nome=Item de teste 2, preco=2.0]

Mas de fato, eu reli o código e nas vezes eu que eu criei dois objetos item, ele não funcionou porque eu esqueci de chamar o dao.insert() :oops:

Você sabe o que pode ser esse primeiro erro?

Hebert_Coelho

felipeaqueiroz:
Mas de fato, eu reli o código e nas vezes eu que eu criei dois objetos item, ele não funcionou porque eu esqueci de chamar o dao.insert() :oops:

Você sabe o que pode ser esse primeiro erro?

Desculpe, mas boiei… qual primeiro erro?

felipeaqueiroz

Hebert Coelho:
felipeaqueiroz:
Mas de fato, eu reli o código e nas vezes eu que eu criei dois objetos item, ele não funcionou porque eu esqueci de chamar o dao.insert() :oops:

Você sabe o que pode ser esse primeiro erro?

Desculpe, mas boiei… qual primeiro erro?

Eu troquei os valores do nome e preço do item e persisti. Daí sumiu no banco o primeiro item que eu tinha persistido, aquele com preço 1.0
Estou fazendo algo errado ou o persist do JPA é assim mesmo?

Hebert_Coelho

Veja se no seu persistence xml não está configurado para fazer drop e create do database.

felipeaqueiroz

Seria essa linha? (acho que sim)

Sendo assim, qual o valor deve estar?
Valeu por ajudar :slight_smile:

lele_vader

vê se o eclipselink tem uma opção update, daí somente atualizaria seu banco.

felipeaqueiroz

Funcionou!
Valeu gente, muito obrigado mesmo :smiley:

Hebert_Coelho

Seria essa linha? (acho que sim)

Sendo assim, qual o valor deve estar?
Valeu por ajudar :slight_smile:

Pesquise no google por:
eclipselink eclipselink.ddl-generation values

Criado 31 de janeiro de 2013
Ultima resposta 31 de jan. de 2013
Respostas 11
Participantes 3