java Hibernate 多対多マッピング
前書き:
1. 一方向多対多
一方向多対多の例では、例として人と役職を使用します。複数のポジションがあり、1 つのポジションに複数の人が所属することもあります。一方向多対多とは、一方の端だけが他方の端のコンテンツをクエリして取得できることを意味します。多対多のリレーションシップは、リレーションシップ モデルを生成するときに、オブジェクトの前にアソシエーション テーブルを生成します。アソシエーション テーブルには、2 つのリレーションシップ テーブルの主キーが次のように格納されます。
:
(1) マッピングとリレーションシップ クラス
これは一方向のリレーションシップであるため、一方の端でのみ維持する必要があるため、User に
Role.hbm.xml コードは比較的シンプルであり、必須ではありません。関係を維持するために追加のタグを追加します:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><hibernate-mapping> <class name="com.bjpowernode.hibernate.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="roles" table="t_user_role"> <key column="user_id"/> <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" /> </set> </class> </hibernate-mapping></span>
ユーザー マッピングにマッピングが設定されているため、対応するマッピングに Hashset を追加する必要がありますUser.java コードは次のとおりです:
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping>
Java コードは次のとおりです:
<span style="font-family:KaiTi_GB2312;font-size:18px;">import java.util.Set; public class User { private int id; private String name; private Set roles; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getRoles() { return roles; } public void setRoles(Set roles) { this.roles = roles; } }</span>
(2) データの追加と読み取り:
まず関係をデータベースに保存し、次にユーザー ハッシュ テーブルを作成し、対応する関係をハッシュ テーブルに追加し、最後にユーザーを作成してハッシュ テーブルをユーザーに追加する必要があります。この部分で注意する必要があるのは書き込み順序です。そうでないと、前のマッピングと同じように null 値が多くなります。
public class Role { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
読み取り時は一方向の関係なので、一方を介して相手の内容を読み取り、ユーザーを介してロールの内容を読み取るだけで済みます。コードは次のとおりです:
public void testSave1() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Role r1 = new Role(); r1.setName("数据录入人员"); session.save(r1); Role r2 = new Role(); r2.setName("商务主管"); session.save(r2); Role r3 = new Role(); r3.setName("商务经理"); session.save(r3); Role r4 = new Role(); r4.setName("项目会计"); session.save(r4); User u1 = new User(); u1.setName("张三"); Set u1Roles = new HashSet(); u1Roles.add(r1); u1Roles.add(r2); u1.setRoles(u1Roles); session.save(u1); User u2 = new User(); u2.setName("李四"); Set u2Roles = new HashSet(); u2Roles.add(r1); u2Roles.add(r2); u2Roles.add(r3); u2.setRoles(u2Roles); session.save(u2); User u3 = new User(); u3.setName("王五"); Set u3Roles = new HashSet(); u3Roles.add(r3); u3Roles.add(r4); u3.setRoles(u3Roles); session.save(u3); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } }
2. 双方向の多対多のマッピング
前に紹介したように、双方向の多対多は両端の関係を同時に維持し、コンテンツをロードできます。コードについて直接言うと、あまり言うことはありません:
双方向であるため、設定ファイルに
public void testLoad1() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); User user = (User)session.load(User.class, 2); System.out.println(user.getName()); for (Iterator iter=user.getRoles().iterator(); iter.hasNext();) { Role role = (Role)iter.next(); System.out.println(role.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } }
User.hbm.xml コードは次のとおりです。これは、一方向マッピング コードと同じです。
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="users" table="t_user_role"> <key column="role_id" not-null="true"/> <many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/> </set> </class> </hibernate-mapping>
Role.java 部分は、一方向 user.java と同様に、コレクション マッピング セットを追加する必要があります。コードは次のとおりです:
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="users" table="t_user_role">
<key column="role_id" not-null="true"/>
<many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/>
</set>
</class>
</hibernate-mapping>
User.hbm.xml と User.java コードは同じです上記のコードと同じなので、すべては掲載しません。
まとめ:
一方向と多方向については、いくつかのブログの紹介で理解できたと思います。覚えておく必要があるのは、一方向と双方向だけです。
読んでいただきありがとうございます、お役に立てれば幸いです、このサイトをサポートしていただきありがとうございます!
Java Hibernate の多対多マッピングの詳細とサンプル コード関連の記事については、PHP 中国語 Web サイトに注目してください。