2010-03-10 104 views
3

我有一个主表是USER的结构,其他表包括CATEGORY(包含user_id)。休眠逆向工程

我得到了什么后,在标准的逆向工程方法是:

  • 类用户包含一个类的集合,
  • 类类别不包含外键(user_ID的),但它确实包含用户对象。

为什么它不包含作为类属性的外键?

我该如何在HQL中连接这两个表而没有粘连? HQL - 请解释这部分。

回答

3

为什么它不包含作为类属性的外键?

因为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 
3

在这种情况下,Hibernate会自动为您处理外键。在Java方面,你不需要考虑外键,而是聚合。这就是为什么Category包含(参照a)User对象,而不是FK。在Hibernate映射中指定了Categoryuser属性与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

+0

我明白了。对我来说,拥有User对象和外键都是很自然的。让我们看看别人会回复什么。谢谢。 – EugeneP 2010-03-10 12:34:04

+0

@EugeneP看到我的更新说明和参考 - 希望它有助于澄清问题。拥有_用户对象__和Java类中的FK将是重复的,需要更多的同步并为错误开辟更多的可能性。此外,PK和FK(应该)通常是DB专用的(这是Hibernate的建议)。 – 2010-03-10 12:42:12

+0

@EugeneP我添加了一个HQL示例和一个引用。 – 2010-03-10 16:27:48

0

我同意与彼得Török:当前休眠行为是所预期的。

例如,当您更新修改用户但不是原始FK的类别时应该休眠的是什么?

为什么你需要生FK?你只需要做category.getUser()。getId();有权访问它,而不会冒你的Category对象中的状态不一致的风险。