Erro com o DB e o Eclipse (Resolvido)

7 respostas
G

E ai galera, tenho uma classe chamada PedidoItem, ela está ligada com a classe Pedidos, que está ligada com a classe Clientes, quando fui rodar a classe PedidoItem, ela deu o seguinte erro:

[TopLink Warning]: 2008.09.18 08:32:06.343--UnitOfWork(16291471)--Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2006.8 (Build 060908)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Column 'clientes_idclientes' cannot be nullError Code: 1048
Call:INSERT INTO pedidos (data_pedido, data_confirmacao, clientes_idclientes) VALUES (?, ?, ?)
	bind => [null, null, null]
Query:InsertObjectQuery(br.org.trisoft.vo.Pedidos@1f)
Exception in thread "main" java.lang.IllegalStateException: 
Exception Description: No transaction is currently active
	at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.rollback(EntityTransactionImpl.java:125)
	at br.org.trisoft.persistence.PedidoItemJPADAO.insert(PedidoItemJPADAO.java:107)
	at br.org.trisoft.service.PedidoItemServiceDAO.insert(PedidoItemServiceDAO.java:26)
	at br.org.trisoft.business.PedidoItemBusiness.inserir(PedidoItemBusiness.java:20)
	at br.org.trisoft.tests.RunJPAPedidoItem.main(RunJPAPedidoItem.java:38)

Fala sobre a tabela no Sql Pedidos, que tem algo errado com o clientes_idclientes. Não estou sabendo resolver, aqui em baicho está o pojo do Pedidos e do PedidoItem:

Pedidos

@Entity   
@Table(name="pedidos")   
public class Pedidos implements Serializable{   
    /**  
     *  
     */   
    private static final long serialVersionUID = -3648045674242128840L;   
    @Id   
    @GeneratedValue(strategy = GenerationType.IDENTITY)   
    @Column(name="idpedidos", nullable=true)   
    private Integer pedidosId;   
    @OneToOne(cascade=(CascadeType.ALL))   
    @JoinColumn(name="clientes_idclientes")   
    private Clientes clientes;   
    @Temporal   
    @Column(name="data_pedido", nullable=true)   
    private GregorianCalendar dataPedido;   
    @Temporal   
    @Column(name="data_confirmacao", nullable=true)   
    private GregorianCalendar dataConfirmacao;   
       
    public Pedidos(){   
           
    }   
  
    public Pedidos(Clientes clientes, GregorianCalendar dataConfirmacao,   
            GregorianCalendar dataPedido, Integer pedidosId) {   
        this.clientes = clientes;   
        this.dataConfirmacao = dataConfirmacao;   
        this.dataPedido = dataPedido;   
        this.pedidosId = pedidosId;   
    }

PedidoItem

@Entity
@Table(name="pedido_item")
public class PedidoItem implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 7326256711354278873L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name="idpedido_item", nullable=true)
	private Integer pedidoItemId;
	@OneToOne(cascade=(CascadeType.ALL))   
	@JoinColumn(name="pedidos_idpedidos")  
	private Pedidos pedidos;
	@OneToOne(cascade=(CascadeType.ALL))   
	@JoinColumn(name="estoque_idestoque")  	
	private Estoque estoque;
	private Integer quantidade;
	@Column(name="preco_venda", nullable=true)
	private Float precoVenda;
	
	public PedidoItem(){}
	

	public PedidoItem(Estoque estoque, Integer pedidoItemId, Pedidos pedidos,
			Float precoVenda, Integer quantidade) {
		this.estoque = estoque;
		this.pedidoItemId = pedidoItemId;
		this.pedidos = pedidos;
		this.precoVenda = precoVenda;
		this.quantidade = quantidade;
	}

Galera me ajuda aew!!

7 Respostas

A
Gab_Java:
E ai galera, tenho uma classe chamada PedidoItem, ela está ligada com a classe Pedidos, que está ligada com a classe Clientes, quando fui rodar a classe PedidoItem, ela deu o seguinte erro:
[TopLink Warning]: 2008.09.18 08:32:06.343--UnitOfWork(16291471)--Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2006.8 (Build 060908)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Column 'clientes_idclientes' cannot be nullError Code: 1048
Call:INSERT INTO pedidos (data_pedido, data_confirmacao, clientes_idclientes) VALUES (?, ?, ?)
	bind => [null, null, null]
Query:InsertObjectQuery(br.org.trisoft.vo.Pedidos@1f)
Exception in thread "main" java.lang.IllegalStateException: 
Exception Description: No transaction is currently active
	at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.rollback(EntityTransactionImpl.java:125)
	at br.org.trisoft.persistence.PedidoItemJPADAO.insert(PedidoItemJPADAO.java:107)
	at br.org.trisoft.service.PedidoItemServiceDAO.insert(PedidoItemServiceDAO.java:26)
	at br.org.trisoft.business.PedidoItemBusiness.inserir(PedidoItemBusiness.java:20)
	at br.org.trisoft.tests.RunJPAPedidoItem.main(RunJPAPedidoItem.java:38)

Fala sobre a tabela no Sql Pedidos, que tem algo errado com o clientes_idclientes. Não estou sabendo resolver, aqui em baicho está o pojo do Pedidos e do PedidoItem:

Pedidos

@Entity   
@Table(name="pedidos")   
public class Pedidos implements Serializable{   
    /**  
     *  
     */   
    private static final long serialVersionUID = -3648045674242128840L;   
    @Id   
    @GeneratedValue(strategy = GenerationType.IDENTITY)   
    @Column(name="idpedidos", nullable=true)   
    private Integer pedidosId;   
    @OneToOne(cascade=(CascadeType.ALL))   
    @JoinColumn(name="clientes_idclientes")   
    private Clientes clientes;   
    @Temporal   
    @Column(name="data_pedido", nullable=true)   
    private GregorianCalendar dataPedido;   
    @Temporal   
    @Column(name="data_confirmacao", nullable=true)   
    private GregorianCalendar dataConfirmacao;   
       
    public Pedidos(){   
           
    }   
  
    public Pedidos(Clientes clientes, GregorianCalendar dataConfirmacao,   
            GregorianCalendar dataPedido, Integer pedidosId) {   
        this.clientes = clientes;   
        this.dataConfirmacao = dataConfirmacao;   
        this.dataPedido = dataPedido;   
        this.pedidosId = pedidosId;   
    }

PedidoItem

@Entity
@Table(name="pedido_item")
public class PedidoItem implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 7326256711354278873L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name="idpedido_item", nullable=true)
	private Integer pedidoItemId;
	@OneToOne(cascade=(CascadeType.ALL))   
	@JoinColumn(name="pedidos_idpedidos")  
	private Pedidos pedidos;
	@OneToOne(cascade=(CascadeType.ALL))   
	@JoinColumn(name="estoque_idestoque")  	
	private Estoque estoque;
	private Integer quantidade;
	@Column(name="preco_venda", nullable=true)
	private Float precoVenda;
	
	public PedidoItem(){}
	

	public PedidoItem(Estoque estoque, Integer pedidoItemId, Pedidos pedidos,
			Float precoVenda, Integer quantidade) {
		this.estoque = estoque;
		this.pedidoItemId = pedidoItemId;
		this.pedidos = pedidos;
		this.precoVenda = precoVenda;
		this.quantidade = quantidade;
	}

Galera me ajuda aew!!

oi,

Coloca um break-point na classe PedidoItemJPADAO antes da linha 107 e tenta fazer um passo a passo, o erro diz que na hora de inserir um pedido a coluna clientes_idclientes está indo nula, como você faz para gerar o id do cliente??

abs

T

Voce deve ter errado alguma configuraçao de base de dados ou nao abriu sessao corretamente…

G

O que seria um break point, eu vou colocar meu código do PedidoItemJPADAO aki em baixo e como esta a tabela do pedidos.

<<<<

package br.org.trisoft.persistence;

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

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

import br.org.trisoft.vo.PedidoItem;

public class PedidoItemJPADAO implements PedidoItemDAO{
	private EntityManagerFactory factory = null;

	private EntityManager manager = null;

	public PedidoItemJPADAO() {

		factory = Persistence.createEntityManagerFactory("estoque");
		manager = factory.createEntityManager();

	}
	
	
	public void delete(Integer userId) {
		EntityTransaction transaction = manager.getTransaction();

		try {

			transaction.begin();

			PedidoItem pedidoItem = manager.find(PedidoItem.class, userId);

			manager.remove(pedidoItem);

			transaction.commit();
			
		} catch (Exception e) {
			transaction.rollback();

			System.err.println("Erro: " + e.getMessage());
		} finally {
			manager.close();
		}	
	}

	
	public PedidoItem getPedidoItem(Integer id, PedidoItem pedidoItem) {
		EntityTransaction transaction = manager.getTransaction();

		PedidoItem retorno = null;

		try {

			transaction.begin();

			retorno = (PedidoItem) manager.find(PedidoItem.class, id);
			
		} catch (Exception e) {
			transaction.rollback();

			System.err.println("Erro: " + e.getMessage());
		} finally {
			manager.close();
		}

		return retorno;
	}

	
	public List<PedidoItem> getTodosPedidoItem() {
		EntityTransaction transaction = manager.getTransaction();

		List<PedidoItem> pedidoItem = new ArrayList<PedidoItem>();

		try {

			transaction.begin();

			pedidoItem = manager.createNativeQuery("select * from pedido_item",
					PedidoItem.class).getResultList();

		} catch (Exception e) {
			transaction.rollback();

			System.err.println("Erro: " + e.getMessage());
		} finally {
			manager.close();
		}

		return pedidoItem;
	}

	
	public void insert(PedidoItem pedidoItem) {
		EntityTransaction transaction = manager.getTransaction();

		try {
			transaction.begin();

			manager.persist(pedidoItem);

			transaction.commit();

		} catch (Exception e) {
			transaction.rollback();

			System.err.println("Erro: " + e.getMessage());

		} finally {
			manager.close();
		}
		
	}

	
	public void update(PedidoItem pedidoItem) {
		EntityTransaction transaction = manager.getTransaction();
		PedidoItem retorno = null;
		try {

			transaction.begin();
				
			retorno = manager.find(PedidoItem.class, pedidoItem.getPedidoItemId());
			retorno.setQuantidade(pedidoItem.getQuantidade());
					
			manager.merge(retorno);

     		transaction.commit();

		} catch (Exception e) {
			transaction.rollback();

			System.err.println("Erro: " + e.getMessage());
		} finally {
			manager.close();
		}

		
	}


}

Tabela de pedidos no sql

Vou colocar o script:
CREATE TABLE pedidos (
  idpedidos INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  clientes_idclientes INTEGER UNSIGNED NOT NULL,
  data_pedido DATE NULL,
  data_confirmacao DATE NULL,
  PRIMARY KEY(idpedidos),
  INDEX pedidos_FKIndex1(clientes_idclientes)
);

CREATE TABLE pedido_item (
  idpedido_item INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  pedidos_idpedidos INTEGER UNSIGNED NOT NULL,
  estoque_idestoque INTEGER UNSIGNED NOT NULL,
  quantidade INTEGER UNSIGNED NULL,
  preco_venda FLOAT NULL,
  PRIMARY KEY(idpedido_item),
  INDEX pedido_item_FKIndex1(estoque_idestoque),
  INDEX pedido_item_FKIndex2(pedidos_idpedidos)
);
A

oi,

Que IDE está usando? O que era?

abs

G

A IDE era Eclipse

Flws

Abss

I

Gab_Java,
sempre que resolver um problema, poste aqui a solução, pois vários usuários podem ter a MESMA dúvida abrindo tópicos desnecessários. :wink:

G

Tudo bem galera, para quem está com o mesmo erro que deu o meu aqui está a solução:

Resolvido:

Como a classe PedidoItem tem ligacao com a classe Pedidos que tem ligacao com a de clientes, o RunJPA tem que estar assim:

public static void main(String[] args) {

		EntityManagerFactory factory = Persistence.createEntityManagerFactory("estoque");
		EntityManager manager = factory.createEntityManager();

		/*
		 * Criando o objeto usuário
		 */
		PedidoItem pedidoItem = new PedidoItem();
		
		pedidoItem.setQuantidade(2);
		
		Pedidos pedidos = new Pedidos();
		
		pedidoItem.setPedidos(pedidos);		
		
		Clientes clientes = new Clientes();
		
		pedidos.setClientes(clientes);		
		
		Estoque estoque = new Estoque();
		
		pedidoItem.setEstoque(estoque);
		
		PedidoItemBusiness pedidoItemBussiness = new PedidoItemBusiness();
		
		pedidoItemBussiness.inserir(pedidoItem);
		
		//Listar   
		List<PedidoItem> ana = pedidoItemBussiness.listar();
		  
		  System.out.println("size: " + ana.size());
		  
		  for (PedidoItem d : ana) { System.out.println("Id: " + d.getPedidoItemId());
		  System.out.println("Login: " + d.getQuantidade()); 
		  System.out.println("Login: " + d.getPedidos().getDataPedido());
		  System.out.println("Login: " + d.getPedidos().getClientes().getNome());
		  System.out.println("Login: " + d.getEstoque().getDescricao()); 
		  }
		 		  		
		System.out.println("Obrigado por se Cadastrar");
	}

Antes eu não tinha colocado, mas tinha que colocar devido PedidoItem Liga com Pedidos, Pedidos liga com Clientes, então consequentemente PedidoItem liga com Clientes através do pedidos

Clientes clientes = new Clientes();
		
		pedidos.setClientes(clientes);

Flws ai galera!!!

Boa programacao!!!

Abraço

Criado 18 de setembro de 2008
Ultima resposta 20 de set. de 2008
Respostas 7
Participantes 4