NOTE: 主题很长但很详细,如果您使用 Doctrine2 和 oneToOne 关系,可能会派上用场。
最近在Doctrine中遇到一个问题:
我创建了具有 oneToOne 双向关系的 User 和 UserData 对象:
User:
...
oneToOne:
userdata:
targetEntity: UserData
mappedBy: user
UserData:
...
oneToOne:
user:
targetEntity: User
inversedBy: userdata
所以 UserData 是拥有 user_id 列的一方:
user: id, ...
userdata: id, user_id, ...
这就产生了一个问题,每次获取 User 对象(单个用户、用户集合或用户加入的其他对象集合)时,Doctrine 都会为每个 User 延迟加载 UserObject。
此处描述的问题:
- 如何防止 Doctrine 延迟加载一对一关系? https://stackoverflow.com/questions/9735930/how-to-prevent-doctrine-from-lazy-loading-one-to-one-relationsip
- http://groups.google.com/group/doctrine-user/browse_thread/thread/7e421a2b189f0ea7 http://groups.google.com/group/doctrine-user/browse_thread/thread/7e421a2b189f0ea7
- https://github.com/doctrine/doctrine2/issues/4389 https://github.com/doctrine/doctrine2/issues/4389
此处描述的建议解决方案:
- https://github.com/doctrine/doctrine2/issues/2364 https://github.com/doctrine/doctrine2/issues/2364
所以有3种方法可以解决这个问题:
- 等待并看看提议的解决方案是否在 Doctrine 中得到解决并在未来版本中修复(可能不会发生)
- 在每个查询中手动将 UserData 保留到 User (仍然浪费资源,不需要 UserData)
- 切换相反方并使用户成为拥有方。
我决定选择#3。所以我的模式关系现在看起来像这样:
User:
...
oneToOne:
userdata:
targetEntity: UserData
inversedBy: user
UserData:
...
oneToOne:
user:
targetEntity: User
mappedBy: userdata
这意味着我的表格现在看起来像这样:
user: id, userdata_id, ...
userdata: id, ...
我决定手动设置 Userdata.id 并将其与 user.id 匹配,而不是自动递增。这意味着 UserData.id 将始终与 user.id 匹配。
Question我可以使用 user.id (主要自动增量键)作为 joinColum 而不是 userdata id 因为它们始终具有相同的值吗?您认为这种做事方式有任何潜在的问题吗?
关于此问题的任何其他提示或意见都非常受欢迎和赞赏。