0

Expert と Technology という名前の 2 つのクラスがあります。Expert は複数のテクノロジをマイトライズできます。テクノロジは複数のエキスパートによってマトライズされます。テクノロジーの追加、更新はクラス Expert とは独立しています。熟練した技術を専門家から削除し、関連する関係のみを削除します。

Class Expert{
     Long id; // getter and setter
     String name; // getter and setter;
     Set<Technology> technos; // getter and setter
} 

Technology{
     Long id; // gettter and setter
     String name; //getter and setter
}

休止状態のマッピングに反映される 2 つのクラス間の関係は次のとおりです。

<class name="Expert">
    <!-- put the declaration for id and name --> 

    <set name="technos" table="EXPERT_TECHNO" cascade="delete-orphan">
            <key column="id_expert"/>
            <many-to-many column="id_techno" class = "Technology"/>
    </set>
</class>

<class name="Technology">
 <!-- put declaration for id and name-->
</class>

これで、テクノロジーのインスタンスができました。テクノロジーを調整するすべての専門家を見つけたいので、休止状態の条件を使用して結果セットを取得する方法を教えてください。または、createQuery を使用して結果セットを取得する最も簡単な方法です。

私は休止状態の基準メソッドに慣れていないので、あなたの助けを求めます!

さらなる質問:

エキスパートからテクノロジーを削除したいときは、テーブル「EXPET_TECHNO」の行を削除するだけですが、expert.getTechnos.remove(techno)がテーブルからテクノロジーを削除します。持ちたくないもの!

4

1 に答える 1

2

まず第一に、この問題を解決する最も簡単な方法は、ManyToManyアソシエーションを双方向にすることです。あなたはただしなければならないでしょう

Set<Expert> experts = technology.getExperts();

さて、それがオプションでない場合、動的に構成されないそのようなクエリの基準よりもHQLの方が簡単です。クエリは次のように簡単になります

select expert from Expert expert 
inner join expert.technos techno 
where techno.id = :technoId

Criteriaを使用してこれを本当に実行したい場合は、次のことを実行する必要があります。

Criteria c = session.createCriteria(Expert.class, "expert");
c.createAlias("expert.technos", "techno");
c.add(Restrictions.eq("techno.id", technoId));

これを自分で見つけて、Hibernateのドキュメントを読むことで他の多くのことを学ぶことができたはずです。

于 2012-05-16T11:46:04.987 に答える