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
- Exemplo de anotações de uma relação ManyToOneEdit
- Exemplo de uma relação ManyToOne relação XMLEdit
- Ver tambémEdit
- Problemas ComunsEditar
- Chave estrangeira também faz parte da chave primária.Editar
- Erro de restrição no insert.Edit
- Foreign key value is nullEdit
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.
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
.