2

晚上好!

我一直在学习并部分使用休眠一段时间,但在使用 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";

当到处都没有定义供应商ID时,为什么他使用“supplierId”作为列值。我无法弄清楚后台发生了什么或为什么它甚至工作......

多年来,我一直在寻找解释。希望你们中的一个人有过类似的经历,可以帮助我。真的很棒。希望我不是太含糊。

祝你有美好的一天,迈克尔·卡格尔


解决方案

问题是我错过了数据库中实际的外键列被称为供应商ID ...

create table Product(
       id int, 
       name varchar,
       description varchar,
       price decimal(6,2),
       >>>> supplierid int <<<<<
)

(我再也不会像那样复制和粘贴代码了..)@carbontax 的帖子@MikkoMaunu 的帖子
对其余部分进行了很好的解释

4

2 回答 2

2

你说这supplierId没有定义,但它是。

当您<many-to-one name="supplier" class="Supplier" column="supplierId"/>在 Product 定义中编写时,您将其定义supplierId为 Product 类上的一个字段。

在 Supplier 类中,您告诉 Hibernate 对于products集合,Product 类中的外键名称是supplierId

当您执行 HQL 语句时,Hibernate 会将此信息转换为“ON p.supplierId=s.id”sql 子句。

于 2012-06-17T15:23:04.357 回答
2

 <many-to-one name="supplier" class="Supplier" column="supplierId"/>

列的值定义产品表中外键列的名称。外键包含供应商表的一些主键值。此列具体化数据库中产品和供应商之间的关系。如果没有这样的列,数据库中的产品和供应商之间就没有关系。然后 Bag 是这种关系的反面。

类似的案例可以从Hibernate 文档中找到。

于 2012-06-17T10:42:44.057 回答