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....