OneToOne Unidirecional

0 respostas
thianolima

Meu problema e o seguinte tenho uma classe pessoa que eu generalizo para a classe instituicao, aluno, professor e outras, porem no momento estou com problemas na classe instituicao pois estou implementando um cadastro em jsf + ejb + jpa2 com eclipslink.

Segue abaixo as minhas classes enxugadas

@Entity
@Table(name = "pessoa")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "pes_tipo", discriminatorType = DiscriminatorType.STRING, length = 1)
@DiscriminatorValue("0")
public class Pessoa implements Serializable {

    private static final long serialVersionUID = 1;

    @Id
    @Column(name = "pes_codigo")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer idPessoa;

    @Column(name = "pes_tipo")
    private String tipo;

    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)    
    @PrimaryKeyJoinColumn(name="pes_codigo")
    Endereco endereco;
   
//get sets
}
@Entity
@Table(name = "endereco")
public class Endereco implements Serializable {

    private static final long serialVersionUID = 1;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "end_codigo")
    private Integer idEndereco;

    @Column(name = "end_numero")
    private int numero;

    @Column(name = "end_complemento")
    private String complemento;

    @OneToOne(mappedBy="endereco", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    @JoinColumn(name="pes_codigo", insertable=true, updatable=true, nullable=false)
    private Pessoa pessoa;

//get sets
}
@Entity
@Table(name="instituicao")
@PrimaryKeyJoinColumn(name="pes_codigo")
@DiscriminatorValue("I")
public class Instituicao extends Pessoa{

    @Column(name="ins_cnpj")
    private String cnpj;

    @Column(name="ins_razao_social")
    private String razaoSocial;

    @Column(name="ins_inscricao_estadual")
    private String inscricaoEstadual;

}

Eu retirei alguns atributos das classes para ficar mais facil de ler o codigo.
Como voces podem ver existe uma classe insitituicao que herda de pessoa e a classe pessoa tem uma associacoa OneToOne para a classe Endereco.
Logo abaixo eu exportei as tabelas do banco de dados MySQL para que voces cosigam ter uma breve nocao de como estao as tabelas

CREATE TABLE `endereco` (
  `end_codigo` int(11) NOT NULL AUTO_INCREMENT,
  `end_numero` int(11) NOT NULL,
  `end_complemento` varchar(255) NOT NULL,
  `log_codigo` int(11) NOT NULL,
  `pes_codigo` int(11) DEFAULT NULL,
  PRIMARY KEY (`end_codigo`),
  KEY `FK_ENDERECO_LOGRADOURO` (`log_codigo`),
  KEY `FK672D67C9FF00390` (`pes_codigo`),
  KEY `FK672D67C9AEE113F7` (`log_codigo`),
  CONSTRAINT `FK_ENDERECO_LOGRADOURO` FOREIGN KEY (`log_codigo`) REFERENCES `logradouro` (`log_codigo`) ON UPDATE CASCADE,
  CONSTRAINT `FK_ENDERECO_PESSOA` FOREIGN KEY (`pes_codigo`) REFERENCES `pessoa` (`pes_codigo`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

CREATE TABLE `pessoa` (
  `pes_codigo` int(11) NOT NULL AUTO_INCREMENT,
  `pes_nome` varchar(50) NOT NULL,
  `pes_telefone` varchar(15) DEFAULT NULL,
  `pes_email` varchar(100) DEFAULT NULL,
  `pes_login` varchar(50) NOT NULL,
  `pes_senha` varchar(20) NOT NULL,
  `pes_bloqueado` varchar(1) NOT NULL DEFAULT 'N',
  PRIMARY KEY (`pes_codigo`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

CREATE TABLE `instituicao` (
  `pes_codigo` int(11) NOT NULL,
  `ins_razao_social` varchar(100) NOT NULL,
  `ins_cnpj` varchar(14) NOT NULL,
  `ins_inscricao_estadual` varchar(20) NOT NULL,
  PRIMARY KEY (`pes_codigo`),
  KEY `PK_EMPRESA` (`pes_codigo`),
  CONSTRAINT `FK_INSTITUICAO_PESSOA` FOREIGN KEY (`pes_codigo`) REFERENCES `pessoa` (`pes_codigo`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

O meu grande problema esta na hora de salvar a Instituicao pois o JPA insere tudo na tabela instituicao, pessoa, e na tabela endereco fica faltando fazer o relacionamento com pessoa ou seja o campo pes_codigo fica vazio.
Ja fiz de tudo quanto e anotacao possivel nessas entidades e nao consegui fazer salvar, alguem aqui poderia me dar uma luz no fim do tunel..???
A ultima tentativa foi inserir primeiro instituicao sem endereco e depois alterar o objeto com a instituicao ja com o idPessoa criado e altera-la e mesmo assim nao houve sucesso algum continuei sem ver o pes_codigo dentro da tabela endereco.
Alguem pode me ajudar urgente com esse problema....

Criado 3 de maio de 2011
Respostas 0
Participantes 1