2

こんばんは!

私はしばらくの間Hibernateを学習して部分的に使用してきましたが、hql結合を使用すると問題が発生しました。

私は練習のためだけにこれらの指示に従い、それがどのように機能するかを確認しました...
http://www.java2s.com/Tutorial/Java/0350__Hibernate/HSQLJoinTwoClasses.htm 彼は基本的に、 サプライヤー

、製品、ソフトウェアの3つのクラスを作成します。
製品多くの製品には1つのサプライヤーがあります

すべてがうまく機能しました...それを自分のコードに実装することを妨げる特定のことを理解できないことを除いて。これは私が理解できない部分です:

<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」を使用しているのですか。バックグラウンドで何が起こっているのか、なぜそれが機能しているのか理解できません...

私は何年もの間説明を探していました。あなたの一人がそのような経験をして、私を助けてくれることを願っています。本当に素晴らしいでしょう。私が漠然としていなかったといいのですが。

良い一日を、マイケル・カーグル


解決

問題は、データベースの実際の外部キー列がsupplierIDと呼ばれることを見逃したことです...

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

(私は二度とそのようなコードをコピーして貼り付けることはありません。)
残りは@carbontaxの投稿@MikkoMaunuの投稿によって大いに説明されています

4

2 に答える 2

2

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

columnの値は、Productテーブルの外部キー列の名前を定義します。外部キーには、Supplierテーブルの主キー値が含まれています。この列は、データベース内の製品とサプライヤー間の関係を具体化します。このような列がないと、データベース内の製品とサプライヤーの間に関係はありません。その場合、バッグはこの関係の逆側になります。

同様のケースは、 Hibernateのドキュメントから見つけることができます。

于 2012-06-17T10:42:44.057 に答える
2

あなたはそれが定義されていないと言いますsupplierIdが、それは定義されています。

<many-to-one name="supplier" class="Supplier" column="supplierId"/>Product定義に書き込むときはsupplierId、Productクラスのフィールドとして定義しています。

productsSupplierクラスでは、コレクションの場合、Productクラスの外部キーの名前がであるとHibernateに伝えていsupplierIdます。

HQLステートメントを実行すると、Hibernateはこの情報を「ONp.supplierId=s.id」SQL句に変換します。

于 2012-06-17T15:23:04.357 に答える