JPA: @OneToMany Unidirecional com @JoinColumn
Neste exemplo de relacionamento @OneToMany com navegabilidade unidirecional a entidade Pessoa contém uma lista da entidade Contato:
@Entity public class Pessoa implements Serializable { @Id @GeneratedValue private Long id; @Column private String nome; @OneToMany @JoinColumn(name="pessoa_id") private List<Contato> contatos; //... }
Ao utilizamos as anotações @OneToMany e @JoinColumn, o relacionamento ocorrerá com a adição da coluna e chave estrangeira pessoa_id a tabela Contato.
@Entity public class Contato implements Serializable { @Id @GeneratedValue private Long id; @Column private String label; @Column private String valor; //... }
Obteremos assim o seguinte DDL:
CREATE TABLE `Pessoa` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `nome` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1; CREATE TABLE `Contato` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `label` varchar(255) DEFAULT NULL, `valor` varchar(255) DEFAULT NULL, `pessoa_id` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `FK9BEFBE0A724ED87D` (`pessoa_id`), CONSTRAINT `FK9BEFBE0A724ED87D` FOREIGN KEY (`pessoa_id`) REFERENCES `Pessoa` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Veja no próximo artigo como fazer o relacionamento @OneToMany bidirecional.
Reinaldo Gil Lima de Carvalho
Categorias:Desenvolvimento de software, Java
@Entity, @OneToMany, JPA
E como seria montado o CRITERIA para eu buscar apenas os contatos da pessoa X?
Ao carregar a pessoa X, seja a partir de seu id pelo entityManager.find(Pessoa.class, id), os contatos já estarão em List contatos. Esse artigo mostra apenas a relação entre as anotações e as tabelas criadas, não aborda o entityManager ou CriteriaQuery.