我有一个主表是用户的结构,其他表包括类别(包含user_id)。
我在标准逆向工程程序之后得到的是:
为什么它不将外键作为类属性包含?
在没有胶水的情况下,如何加入HQL中的这两张桌子?HQL -请解释这部分。
发布于 2010-03-10 14:46:17
为什么它不将外键作为类属性包含?
由于Hibernate是一个Object-Relational映射工具,Hibernate允许使用对象模型(即对象和对象之间的关系)并将它们映射到数据库表示(表的数据行)。Hibernate的全部目的是弥合面向对象范式和关系范式(著名的对象-关系阻抗失配)之间的差距。在您的示例中,下面的对象模型是预期的(和正确的)对象表示:
alt文本http://img251.imageshack.us/img251/6335/110b578b.png
在没有胶水的情况下,如何加入HQL中的这两张桌子?
胶水在那里,但你必须考虑对象(和关联)。例如(请参阅14.3.协会和联接):
from Category as category join category.user as user注意,HQL支持两种形式的关联连接:隐式和显式(参见14.4.联接语法形式)。上面的示例使用显式联接。隐式表单不使用join关键字,而是使用点表示法:
from Category category where category.user.id =: id发布于 2010-03-10 12:26:53
在这种情况下,Hibernate自动为您处理外键。在Java方面,您不需要考虑外键,而需要考虑聚合。这就是为什么Category包含一个(引用) User对象,而不是一个FK。类user属性Category与USER表中的FK列之间的绑定在Hibernate映射中指定。
如果然后使用这些类创建条件或查询,Hibernate将使用正确的FK自动生成SQL查询。我没有使用HQL的经验,但我确信Hibernate也正确地处理了这个问题。
更新: HQL示例:
from Category as category inner join fetch category.user as user示例改编自这里。
有关映射的更多细节,请参见Hibernate参考文献,第5章 to 7。
发布于 2010-03-10 14:06:36
我同意Péter T r k的观点:目前的冬眠行为是人们所期待的。
例如,当您更新修改用户而不是原始FK的类别时,hibernate应该做什么?
你为什么需要生的FK?您只需执行category.getUser().getId();才能访问它,而不会在您的类别对象中冒出不一致的状态。
https://stackoverflow.com/questions/2416775
复制相似问题