Hibernate HQL Mapping异常的列名

时间:2012-06-16 17:51:30

标签: hibernate hql hibernate-mapping

晚上好!

我一直在学习并部分使用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


解决方案

问题是我错过了数据库中的实际Foreignkey列被称为supplierID ...

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

(我永远不会复制和粘贴这样的代码..)其余部分由@carbontax's post@MikkoMaunu's post

大大解释

2 个答案:

答案 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子句。