Java Persistence/ManyToOne

author
3 minutes, 52 seconds Read

A ManyToOne relação em Java é onde o objeto fonte tem um atributo que faz referência a outro objeto, o objeto alvo. Ou seja, o típico caso Java em que um objeto tem uma referência a outro objeto. Um relacionamento ManyToOne pode ser especificado unidirecional. Entretanto, é típico que o objeto alvo tenha a relação inversa especificada de volta para o objeto fonte. Isto seria uma especificação de relação OneToMany no objeto de destino. Todas as relações em Java e JPA são unidirecionais, na medida em que se um objeto de origem faz referência a um objeto de destino não há garantia de que o objeto de destino também tenha uma relação com o objeto de origem. Isto é diferente de um banco de dados relacional, no qual as relações são definidas através de chaves estrangeiras e consultas de modo que a consulta inversa sempre exista.

No JPA uma relação ManyToOne é especificada através da anotação @ManyToOne ou do elemento <many-to-one>. Uma @ManyToOne anotação é normalmente acompanhada por uma @JoinColumn anotação. A @JoinColumn anotação especifica como a relação deve ser mapeada para (expressa em) a base de dados. O @JoinColumn define o nome da coluna chave estrangeira (@JoinColumn(name = "...")) no objeto fonte que deve ser usado para encontrar (juntar) o objeto alvo.

Se o inverso OneToMany relação é especificado no objeto alvo, então o @OneToMany anotação no objeto alvo deve conter um atributo mappedBy para definir esta relação inversa.

JPA também define uma relação OneToOne, que é semelhante a uma relação ManyToOne, exceto que a relação inversa (se fosse definida) é uma relação OneToOne. A principal diferença entre uma relação OneToOne e uma relação ManyToOne no JPA é que uma relação ManyToOne contém sempre uma chave estrangeira da tabela do objeto de origem para a tabela do objeto de destino, enquanto que uma relação OneToOne a chave estrangeira pode estar na tabela do objeto de origem ou na tabela do objeto de destino.

Exemplo de um banco de dados de relação ManyToOneEdit

EMPLOYEE (tabela)

EMP_ID FIRSTNAME LASTNAME SALÁRIA ID_MANAGER_ID
1 Bob Viagem 50000 2
2 Sarah Smith 75000 null

PHONE (tabela)

ID TYPE AREA_CODE P_NUMBER ID_P_NUMBER
1 home 613 792-0000 1
2 trabalho 613 896-1234 1
3 trabalho 416 123-4444 2

Exemplo de anotações de uma relação ManyToOneEdit

@Entitypublic class Phone { @Id private long id; ... // Specifies the PHONE table does not contain an owner column, but // an OWNER_ID column with a foreign key. And creates a join to // lazily fetch the owner @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="OWNER_ID") private Employee owner; ...}// Specification of the reverse OneToMany relationship in Employee@Entitypublic class Employee { @Id private long emp_id; ... // The 'mappedBy = "owner"' attribute specifies that // the 'private Employee owner;' field in Phone owns the // relationship (i.e. contains the foreign key for the query to // find all phones for an employee.) @OneToMany(mappedBy = "owner") private List<Phone> phones; ...

Exemplo de uma relação ManyToOne relação XMLEdit

<entity name="Phone" class="org.acme.Phone" access="FIELD"> <attributes> <id name="id"/> <many-to-one name="owner" fetch="LAZY"> <join-column name="OWNER_ID"/> </many-to-one> </attributes></entity>

Ver tambémEdit

  • Relações
    • Cascading
    • Preguiça de Busca
    • Entidade alvo
    • Jun Fetching
    • Leitura em lote
    • Problemas comuns
  • Um-para-Um
    • Maptando um OneToOne Usando uma Tabela de Junção
  • OneToMany

Problemas ComunsEditar

Chave estrangeira também faz parte da chave primária.Editar

Ver Chaves primárias através de relações OneToOne. insertable, updatable = false. Veja Target Foreign Keys, Primary Key Join Columns, Cascade Primary Keys.

Erro de restrição no insert.Edit

Isto normalmente ocorre porque você mapeou incorretamente a chave estrangeira em um relacionamento OneToOne. Veja Target Foreign Keys, Primary Key Join Columns, Cascade Primary Keys. Isso também pode ocorrer se o seu provedor JPA não suportar integridade referencial, ou não resolver restrições bidirecionais. Neste caso, você pode precisar remover a restrição ou usar EntityManager flush() para garantir a ordem em que seus objetos estão escritos.

Foreign key value is nullEdit

Certifique-se de definir o valor do objeto OneToOne, se o OneToOne for parte de uma relação bi-direcional OneToMany, certifique-se de definir o objeto OneToOne ao adicionar um objeto ao OneToMany, JPA não mantém relações bi-direcionais para você. Verifique também se você definiu o JoinColumn corretamente, certifique-se de não definir o insertable, updateable = false ou use um PrimaryKeyJoinColumn.

Similar Posts

Deixe uma resposta

O seu endereço de email não será publicado.