Por que esse codigo JPA não funciona?

2 respostas
faeldix

Pessoal segue o meu codigo:

package pacote;

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

public class TesteJPA {

	public static void main(String[] args) {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("teste");
		EntityManager manager = factory.createEntityManager();
		
		ClientePessoaFisica fisica = new ClientePessoaFisica();
		fisica.setId(1);
		fisica.setCPF("123");
		
		manager.getTransaction().begin();
		manager.persist(fisica);
		manager.getTransaction().commit();
		
	}

}
package pacote;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "cliente")
public abstract class Cliente {
	
	@Id
	@Column(name = "id")
	protected Integer id;
	
	@Column(name = "cliente_tipo_id")
	protected Integer idTipo;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Integer getIdTipo() {
		return idTipo;
	}



}
package pacote;

import javax.persistence.Column;

public class ClientePessoaFisica extends Cliente {

	public String getCPF() {
		return CPF;
	}

	public void setCPF(String cPF) {
		CPF = cPF;
	}

	public ClientePessoaFisica() {
		this.idTipo = 1; /* SENDO O ID DO TIPO PESSOA FISICA = 1 */
	}

	@Column(name = "identificador")
	private String CPF;
}
package pacote;

import javax.persistence.Column;

public class ClientePessoaFisica extends Cliente {

	public String getCPF() {
		return CPF;
	}

	public void setCPF(String cPF) {
		CPF = cPF;
	}

	public ClientePessoaFisica() {
		this.idTipo = 1; /* SENDO O ID DO TIPO PESSOA FISICA = 1 */
	}

	@Column(name = "identificador")
	private String CPF;
}

modelagem do meu banco:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `teste` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `teste` ;

-- -----------------------------------------------------
-- Table `teste`.`TipoCliente`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `teste`.`TipoCliente` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `descricao` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `teste`.`Cliente`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `teste`.`Cliente` (
  `id` INT NOT NULL ,
  `identificador` VARCHAR(45) NOT NULL ,
  `cliente_tipo_id` INT NOT NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `fk_Cliente_TipoCliente` (`cliente_tipo_id` ASC) ,
  CONSTRAINT `fk_Cliente_TipoCliente`
    FOREIGN KEY (`cliente_tipo_id` )
    REFERENCES `teste`.`TipoCliente` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;



SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

STACK

log4j:WARN No appenders could be found for logger (org.jboss.logging). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. Exception in thread "main" java.lang.IllegalArgumentException: Unknown entity: pacote.ClientePessoaFisica at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:853) at pacote.TesteJPA.main(TesteJPA.java:21)

Alguma ideia? :~

2 Respostas

A

Dê uma olhada nesse link:

http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

Repare a parte de mapping de herança… e reveja o seu codigo.

:wink:

drsmachado

Teu mapeamento está errado.

Unknown entity: pacote.ClientePessoaFisica

Tanto que a entidade ClientePessoaFisica não é considerada um entity.

Criado 1 de julho de 2013
Ultima resposta 2 de jul. de 2013
Respostas 2
Participantes 3