我有一个主表是USER的结构,其他表包括CATEGORY(包含user_id)。休眠逆向工程
我得到了什么后,在标准的逆向工程方法是:
- 类用户包含一个类的集合,
- 类类别不包含外键(user_ID的),但它确实包含用户对象。
为什么它不包含作为类属性的外键?
我该如何在HQL中连接这两个表而没有粘连? HQL - 请解释这部分。
我有一个主表是USER的结构,其他表包括CATEGORY(包含user_id)。休眠逆向工程
我得到了什么后,在标准的逆向工程方法是:
为什么它不包含作为类属性的外键?
我该如何在HQL中连接这两个表而没有粘连? HQL - 请解释这部分。
为什么它不包含作为类属性的外键?
因为Hibernate是一个对象 - 关系映射工具,休眠允许与对象模型的工作(即对象和对象之间的关系),并将它们映射到数据库中表示(表的数据的行)。 Hibernate的重点在于弥合面向对象范式和关系范式(着名的Object-Relational Impedance Mismatch)之间的差距。对你来说,这下面的对象模型的预期(右)对象表示:
alt text http://img251.imageshack.us/img251/6335/110b578b.png
我如何加入HQL这两个表没有这种胶水?
胶水是那里,但你必须考虑对象(和关联)。例如(见14.3. Associations and joins):
from Category as category join category.user as user
注意HQL支持两种形式的联合加盟:隐和明确(见14.4. Forms of join syntax)。上面的示例使用明确的连接。该隐含形式不使用join关键字,但在点格式:
from Category category where category.user.id =: id
在这种情况下,Hibernate会自动为您处理外键。在Java方面,你不需要考虑外键,而是聚合。这就是为什么Category
包含(参照a)User
对象,而不是FK。在Hibernate映射中指定了Category
的user
属性与USER
表中的FK列之间的绑定。
如果使用这些类创建Criteria或Query,Hibernate会自动使用适当的FK生成SQL查询。我没有使用HQL的经验,但我非常肯定Hibernate也能正确处理它。
更新: HQL例如:
from Category as category inner join fetch category.user as user
实施例改编自here。
有关映射的更多详细信息,请参阅Hibernate Reference, chapters 5至7
我同意与彼得Török:当前休眠行为是所预期的。
例如,当您更新修改用户但不是原始FK的类别时应该休眠的是什么?
为什么你需要生FK?你只需要做category.getUser()。getId();有权访问它,而不会冒你的Category对象中的状态不一致的风险。
我明白了。对我来说,拥有User对象和外键都是很自然的。让我们看看别人会回复什么。谢谢。 – EugeneP 2010-03-10 12:34:04
@EugeneP看到我的更新说明和参考 - 希望它有助于澄清问题。拥有_用户对象__和Java类中的FK将是重复的,需要更多的同步并为错误开辟更多的可能性。此外,PK和FK(应该)通常是DB专用的(这是Hibernate的建议)。 – 2010-03-10 12:42:12
@EugeneP我添加了一个HQL示例和一个引用。 – 2010-03-10 16:27:48