En primer lugar, algunas aclaraciones a la respuesta de KLE :
La asociación uno a uno sin restricciones (anulable) es la única que no se puede representar sin instrumentación de bytecode. La razón de esto es que la entidad propietaria DEBE saber si la propiedad de asociación debe contener un objeto proxy o NULL y no puede determinar eso mirando las columnas de su tabla base debido a que normalmente se asigna uno a uno a través de PK compartida, por lo que tiene que ser traído con entusiasmo de todos modos haciendo que el proxy no tenga sentido. Aquí hay una explicación más detallada .
las asociaciones de muchos a uno (y uno a muchos, obviamente) no sufren este problema. La entidad propietaria puede verificar fácilmente su propio FK (y en el caso de uno a muchos, el proxy de colección vacío se crea inicialmente y se completa a pedido), por lo que la asociación puede ser perezosa.
Reemplazar uno a uno por uno a muchos nunca es una buena idea. Puede reemplazarlo con muchos a uno únicos, pero hay otras opciones (posiblemente mejores).
Rob H. tiene un punto válido, sin embargo, es posible que no pueda implementarlo dependiendo de su modelo (por ejemplo, si su asociación uno a uno es anulable).
Ahora, en cuanto a la pregunta original:
A) @ManyToOne(fetch=FetchType.LAZY)
debería funcionar bien. ¿Estás seguro de que no se sobrescribe en la consulta en sí? Es posible especificar join fetch
en HQL y / o establecer explícitamente el modo de búsqueda a través de Criteria API, que tendría prioridad sobre la anotación de clase. Si ese no es el caso y todavía tiene problemas, publique sus clases, consultas y el SQL resultante para una conversación más precisa.
B) @OneToOne
es más complicado. Si definitivamente no es anulable, vaya con la sugerencia de Rob H. y especifíquelo como tal:
@OneToOne(optional = false, fetch = FetchType.LAZY)
De lo contrario, si puede cambiar su base de datos (agregue una columna de clave externa a la tabla de propietarios), hágalo y asignela como "unida":
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="other_entity_fk")
public OtherEntity getOther()
y en OtherEntity:
@OneToOne(mappedBy = "other")
public OwnerEntity getOwner()
Si no puede hacer eso (y no puede vivir con una búsqueda ansiosa), la instrumentación de código de bytes es su única opción. Sin embargo, tengo que estar de acuerdo con CPerkins , ¡si tienes 80! se une debido a las ansiosas asociaciones OneToOne, tienes mayores problemas que esto :-)
one-to-one
con una fórmula comoselect other_entity.id from other_entity where id = other_entity.id
. Por supuesto, esto no es ideal para realizar consultas.