Primeiro, alguns esclarecimentos à resposta do KLE :
A associação individual irrestrita (anulável) é a única que não pode ser proxy sem a instrumentação de bytecode. A razão para isso é que a entidade proprietária DEVE saber se a propriedade da associação deve conter um objeto proxy ou NULL e não pode determinar isso observando as colunas da tabela base, porque normalmente um a um é mapeado através de PK compartilhada. precisa ser buscado de qualquer maneira, tornando o proxy inútil. Aqui está uma explicação mais detalhada .
associações muitos-para-um (e um-para-muitos, obviamente) não sofrem com esse problema. A entidade proprietária pode facilmente verificar seu próprio FK (e, no caso de um para muitos, o proxy de coleção vazio é criado inicialmente e preenchido sob demanda), para que a associação seja preguiçosa.
Substituir um para um por um para muitos nunca é uma boa ideia. Você pode substituí-lo por muitos exclusivos para muitos, mas existem outras opções (possivelmente melhores).
Rob H. tem um ponto válido, no entanto, talvez você não consiga implementá-lo, dependendo do seu modelo (por exemplo, se sua associação um a um é anulável).
Agora, no que diz respeito à pergunta original:
A) @ManyToOne(fetch=FetchType.LAZY)
deve funcionar muito bem. Tem certeza de que não está sendo substituído na própria consulta? É possível especificar join fetch
no HQL e / ou definir explicitamente o modo de busca via API de critérios, o que teria precedência sobre a anotação de classe. Se esse não for o caso e você ainda estiver com problemas, publique suas classes, consulte o SQL resultante para obter uma conversa mais direta.
B) @OneToOne
é mais complicado. Se definitivamente não for anulável, siga a sugestão de Rob H. e especifique-a da seguinte forma:
@OneToOne(optional = false, fetch = FetchType.LAZY)
Caso contrário, se você puder alterar seu banco de dados (adicionar uma coluna de chave estrangeira à tabela do proprietário), faça-o e mapeie-o como "unido":
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="other_entity_fk")
public OtherEntity getOther()
e em OtherEntity:
@OneToOne(mappedBy = "other")
public OwnerEntity getOwner()
Se você não pode fazer isso (e não pode viver com a busca ansiosa), a instrumentação bytecode é sua única opção. Eu tenho que concordar com CPerkins , no entanto - se você tem 80 !!! se une devido a associações OneToOne, você tem problemas maiores que este :-)
one-to-one
com uma fórmula comoselect other_entity.id from other_entity where id = other_entity.id
. Obviamente, isso não é ideal para performances de consulta.