【问题标题】:Hibernate HQL Mapping unusual column-nameHibernate HQL 映射异常的列名
【发布时间】:2012-06-19 09:55:28
【问题描述】:

晚上好!

我已经学习并部分使用了休眠一段时间,但在使用 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's post@MikkoMaunu's post 对其余部分进行了很好的解释

【问题讨论】:

    标签: hibernate hql hibernate-mapping


    【解决方案1】:

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

    当您在 Product 定义中写入 &lt;many-to-one name="supplier" class="Supplier" column="supplierId"/&gt; 时,您将 supplierId 定义为 Product 类中的一个字段。

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

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

    【讨论】:

    • Awww 我怎么能错过那个......你现在知道我现在有多尴尬了。永远不要少..感谢您的精彩解释!它使一些事情变得更加清晰!谢谢!
    【解决方案2】:

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

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

    类似案例可以从Hibernate documentation找到。

    【讨论】:

    • 感谢您的精彩解释!令人尴尬的是我错过了那个“细节”。但是感谢您的精彩解释!简短而清晰..我不知何故真的很困惑;)谢谢你们两个!祝你有美好的一天!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2018-02-24
    • 2020-04-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多