晚上好!
我一直在学习并部分使用hibernate一段时间,并使用hql连接遇到麻烦。
我按照这些说明进行练习,看看它是如何工作的......
http://www.java2s.com/Tutorial/Java/0350__Hibernate/HSQLJoinTwoClasses.htm
他基本上创造了3个班级:
供应商,产品,软件
一个供应商有很多产品
许多产品都有一个供应商
一切都运行得很好......除了我无法理解一个阻止我将其实现到我自己的代码中的特定事物。 这是我无法理解的部分:
<class name="Product">
<id name="id" type="int">
<generator class="increment"/>
</id>
<property name="name" type="string"/>
<property name="description" type="string"/>
<property name="price" type="double"/>
<many-to-one name="supplier" class="Supplier" column="supplierId"/>
</class>
<class name="Supplier" >
<id name="id" type="int">
<generator class="increment"/>
</id>
<property name="name" type="string"/>
<bag name="products" inverse="true" cascade="all,delete-orphan">
<key column="supplierId"/>
<one-to-many class="Product"/>
</bag>
</class>
The query would be:
SELECT s.name, p.name, p.price
FROM Product p INNER JOIN p.supplier AS s";
当没有在任何地方定义supplierID时,他为什么使用“supplierId”作为列值。我无法弄清楚背景中发生了什么,或者为什么它还在工作......
我一直在寻找多年的解释..希望你们中的一个人做过这样的经历并且可以帮助我。真的很棒。希望我不是太模糊。
祝你有愉快的一天, Michael Kargl
create table Product(
id int,
name varchar,
description varchar,
price decimal(6,2),
>>>> supplierid int <<<<<
)
(我永远不会复制和粘贴这样的代码..)其余部分由@carbontax's post和@MikkoMaunu's post
大大解释答案 0 :(得分:2)
在
<many-to-one name="supplier" class="Supplier" column="supplierId"/>
列的值定义Product表中外键列的名称。外键包含Supplier表的一些主键值。 该列实现了数据库中Product和Supplier之间的关系。如果没有这样的列,数据库中的产品和供应商之间就没有关系。 袋子就是这种关系的反面。
可以从Hibernate documentation找到类似的案例。
答案 1 :(得分:2)
你说supplierId
没有定义,但确实如此。
在产品定义中编写<many-to-one name="supplier" class="Supplier" column="supplierId"/>
时,您将supplierId
定义为Product类中的字段。
在Supplier类中,您告诉Hibernate对于products
集合,Product类中的外键名称为supplierId
。
执行HQL语句时,Hibernate会将此信息转换为“ON p.supplierId = s.id”sql子句。