@OneToMany sem relacionamento inverso e sem uma tabela de junit?

Este é um problema semelhante ao “Hibernate @OneToMany sem uma tabela de junit separada” , em que eu preciso de um relacionamento @OneToMany sem uma tabela de junit. No entanto, eu também gostaria de não definir o relacionamento inverso. Remover o inverso parece resultar em uma tabela de junit sendo gerada automaticamente … existe uma solução para isso?

No JPA 2.0+, você pode usar @JoinColumn como uma maneira de evitar gerar uma tabela unida.

Tente.

@OneToMany @JoinColumn(name="COLUMN_NAME") 

ATUALIZAR

A informação fornecida acima foi extraída do livro do EJB 3.0 o’reilly (Procure a anotação @JoinColumn referencia a coluna CUSTOMER_ID na tabela PHONE). No entanto, a especificação simples do JPA 1.0 não suporta esse recurso. O que diz é

Os relacionamentos um-para-muitos unidirecionais podem ser implementados usando mapeamentos de chave estrangeira de um para muitos, no entanto, esse suporte não é necessário nesta liberação. Os aplicativos que desejam usar uma estratégia de mapeamento de chave estrangeira para relacionamentos um-para-muitos devem tornar esses relacionamentos bidirecionais para garantir a portabilidade

Então, em 1.0, é uma implementação específica do fornecedor (E faz sentido, O autor trabalha no JBoss – A divisão do chapéu vermelho atrás do hibernate)

Mas é suportado pela implementação do JPA 2.0

Se a junit for para um mapeamento OneToMany unidirecional usando uma estratégia de mapeamento de chave estrangeira, a chave estrangeira estará na tabela da entidade de destino .

A especificação JPA 1.0 NÃO suporta mapeamento OneToMany unidirecional sem uma tabela de associação.

E usar um JoinColumn em um OneToMany não é permitido no padrão JPA 1.0 (somente em um OneToOne , ManyToOne ou ManyToMany ). Está no JPA 2.0 embora.

A partir da especificação do JPA 1.0:

2.1.8.5.1 Relações OneToMany Unidirecionais

Os seguintes padrões de mapeamento se aplicam:

Entidade A é mapeada para uma tabela chamada A A entidade B é mapeada para uma tabela chamada B Existe uma tabela de associação denominada A_B (nome do proprietário primeiro). Essa tabela de junit possui duas colunas de chave estrangeira. Uma coluna de chave estrangeira se refere à tabela A e possui o mesmo tipo da chave primária da tabela A O nome dessa coluna de chave estrangeira é formado como a concatenação do seguinte: o nome da entidade A; “_”; o nome da coluna da chave primária na tabela A A outra coluna de chave estrangeira refere-se à tabela B e tem o mesmo tipo da chave primária da tabela B e há uma restrição de chave exclusiva nela. O nome dessa coluna de chave estrangeira é formado como a concatenação do seguinte: o nome da propriedade de relacionamento ou campo da entidade A; “_”; o nome da coluna da chave primária na tabela B

Para resumir, se você não quiser uma tabela de associação (e suporte total de leitura / gravação) e ainda quiser ser compatível com JPA, torne a associação bidirecional (com um lado inverse ).

O link do wiki book abaixo discute um truque (mapear a tabela de destino como a tabela de junit) para “contornar” o problema, mas isso só funciona para leituras, as gravações não funcionam.

Referências

  • Especificação JPA 1.0
    • 2.1.8.2 Relacionamentos Bidirecionais de ManyToOne / OneToMany
    • 2.1.8.5.1 Relações OneToMany Unidirecionais
    • 9.1.6 Anotação JoinColumn (discute em qual contexto esta anotação pode ser usada)
  • Livro de Wiki do JPA
    • 2.1 OneToMany não direcional, sem ManyToOne inversa, nenhuma tabela de associação (JPA 2.0)

Se não houver nenhuma tabela de junit no database, a relação entre duas tabelas no database será obtida pela chave estrangeira referente à chave primária. Se o relacionamento for por meio do PK / FK, deverá haver uma propriedade na class de destino que se refere à origem para que a coluna FK seja preenchida com um valor. Essa propriedade na class de destino pode ser um id ou um object de origem. Se for um object de origem, você precisará ter uma @ManyToOne inversa na class de destino.