首先,对KLE的答案进行一些澄清:
无约束(可为空)的一对一关联是没有字节码检测就无法代理的唯一关联。原因是所有者实体必须知道关联属性应包含代理对象还是NULL,并且由于通常是通过共享PK进行一对一映射,因此无法通过查看其基表的列来确定该属性。无论如何,必须急切地获取代理,使其毫无意义。这是一个更详细的说明。
多对一关联(显然是一对多)不受此问题困扰。所有者实体可以轻松地检查其自己的FK(如果是一对多,则最初会创建空集合代理并按需填充),因此关联可以很懒。
用一对多替换一对一几乎不是一个好主意。您可以用唯一的多对一替换它,但是还有其他(可能更好)的选择。
Rob H.有一个有效的观点,但是您可能无法实现它,具体取决于您的模型(例如,如果您的一对一关联为空)。
现在,就原始问题而言:
A)@ManyToOne(fetch=FetchType.LAZY)
应该工作正常。您确定查询本身不会覆盖它吗?可以指定join fetch
在HQL中和/或通过Criteria API显式设置获取模式,这将优先于类注释。如果不是这种情况,但您仍然遇到问题,请发布您的课程,查询和生成的SQL,以进行更多的即时对话。
B)@OneToOne
比较棘手。如果绝对不能为空,请遵循Rob H.的建议,并这样指定:
@OneToOne(optional = false, fetch = FetchType.LAZY)
否则,如果您可以更改数据库(向所有者表添加外键列),请进行更改并将其映射为“ joined”:
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="other_entity_fk")
public OtherEntity getOther()
并在OtherEntity中:
@OneToOne(mappedBy = "other")
public OwnerEntity getOwner()
如果您不能做到这一点(并且不能随心所欲地抓取),则字节码检测是您唯一的选择。我必须同意CPerkins,但是-如果您有80 岁!加入由于渴望OneToOne协会,您有更大的问题,然后这:-)
one-to-one
带有的公式,例如select other_entity.id from other_entity where id = other_entity.id
。当然,这对于查询性能不是理想的。