hibernate 理解 many to many映射

一、創建單獨的表,(java文件包含關聯Set對象,但xml中不配置set集合和多對多關係,程序能夠正常運行

public class Person {

private int id;

private String name;

Set<Menu> menus;

 

 

public class Menu {

private int id;

private String name;

Set<Person> persons;

 

<hibernate-mapping package="com.jxq.model">

<class name="Menu" table="t_menu"> 

<id name="id" column="id">

<generator class="native"></generator>

</id>

<property name="name"  />

</class>

</hibernate-mapping>

 

<hibernate-mapping package="com.jxq.model">

<class name="Person" table="t_person"> 

<id name="id" column="id">

<generator class="native"></generator>

</id>

<property name="name"  />

</class>

</hibernate-mapping>

 

ss=HibernateUtils.openSession();

ss.beginTransaction();

 

Person p1=new Person();

p1.setName("張三");

ss.save(p1);

 

Person p2=new Person();

p2.setName("李四");

ss.save(p2);

 

Menu m1=new Menu();

m1.setName("來電登記");

ss.save(m1);

 

Menu m2=new Menu();

m2.setName("綜合查詢");

ss.save(m2);

 

ss.getTransaction().commit();

 

運行結果:

Hibernate: insert into t_person (name) values (?)

Hibernate: insert into t_person (name) values (?)

Hibernate: insert into t_menu (name) values (?)

Hibernate: insert into t_menu (name) values (?)

二、Xml中單邊簡單配置set集合和多對多關係,java文件中不主動保存關聯對象,仍然能夠正常運行,同時會生成匿名的中間表menu_persons,只是在中間表中不生成數據。

<hibernate-mapping package="com.jxq.model">

<class name="Menu" table="t_menu"> 

<id name="id" column="id">

<generator class="native"></generator>

</id>

<property name="name"  />

 

<set name="persons">

<key column="mid" />

<many-to-many class="Person" column="pid" />

</set>

</class>

</hibernate-mapping>

 

Person p1=new Person();

p1.setName("張三");

ss.save(p1);

 

Person p2=new Person();

p2.setName("李四");

ss.save(p2);

 

Menu m1=new Menu();

m1.setName("來電登記");

ss.save(m1);

 

Menu m2=new Menu();

m2.setName("綜合查詢");

ss.save(m2);

 

 

 

三、單邊進行多對多配置,自動生產指定名稱的中間關係映射表

還是在menu.hbm.xml中,進行單邊配置多對多關係。

  1. 指定生成中間表的名稱。在set中指定table屬性,生成的中間表的名字即爲t_rights。
  2. Set配置的含義理解。

在menu.hbm.xml中配置persons屬性的映射關係,表示hibernate代碼通過menu對象添加數據和包含的persons對象,並且會自動維持關聯關係,保存映射數據到中間表中。

3.Table屬性指定生成中間表的名稱爲t_rights。

4.Key 和column指的是要在中間表創建的字段名稱,並且該字段自動作爲外鍵關聯到t_menu表的id。

5.Many to many中class和column指定關聯對象類型和在其在中間表的外鍵。同時指出多個person可以對應同個menu,多個menu可以對應同個person。

<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->

<hibernate-mapping package="com.jxq.model">

<class name="Menu" table="t_menu">

<id name="id" column="id">

<generator class="native"></generator>

</id>

<property name="name"  />

 

<set name="persons" table="t_rights" lazy="extra">

<key column="mid" />

<many-to-many class="Person" column="pid" />

</set>

</class>

</hibernate-mapping>

 

四、單邊配置多對多關係,使用配置方對象保存,才能自動生成中間映射數據。

java文件中hibernate代碼必須使用配置方對象來添加關聯對象,保存時纔會生成映射數據。從另一方對象保存,不會生成映射數據。

ss=HibernateUtils.openSession();

ss.beginTransaction();

 

Person p1=new Person();

p1.setName("張三");

ss.save(p1);

 

Person p2=new Person();

p2.setName("李四");

ss.save(p2);

 

Menu m1=new Menu();

m1.setName("來電登記");

ss.save(m1);

 

Menu m2=new Menu();

m2.setName("綜合查詢");

ss.save(m2);

//僅在menu.hbm.xml中配置了多對多關係,在person.hbm.xml中沒有配置多對多關係。

//此時通過persson對象來保存關聯對象,不會自動在t_rights表中生成映射數據。

// p1.add(m1);

// p1.add(m2);

// ss.save(p1);

// p2.add(m1);

// p2.add(m2);

// ss.save(p2);

//僅在menu.hbm.xml中配置了多對多關係,在person.hbm.xml中沒有配置多對多關係

//此時通過menu對象來保存關聯對象,會自動在t_rights表中生成映射數據。

m1.add(p1);

m1.add(p2);

ss.save(m1);

m2.add(p1);

m2.add(p2);

ss.save(m2);

 

ss.getTransaction().commit();

 

運行結果:

Hibernate: create table t_menu (id integer not null auto_increment, name varchar(255), primary key (id))

Hibernate: create table t_person (id integer not null auto_increment, name varchar(255), primary key (id))

Hibernate: create table t_rights (mid integer not null, pid integer not null, primary key (mid, pid))

Hibernate: alter table t_rights add constraint FK33ricdj1vs8v69eanv8ef5vm5 foreign key (pid) references t_person (id)

Hibernate: alter table t_rights add constraint FKl36tf2s2kw0pb9ihtu4ysbf64 foreign key (mid) references t_menu (id)

Hibernate: insert into t_person (name) values (?)

Hibernate: insert into t_person (name) values (?)

Hibernate: insert into t_menu (name) values (?)

Hibernate: insert into t_menu (name) values (?)

Hibernate: insert into t_rights (mid, pid) values (?, ?)

Hibernate: insert into t_rights (mid, pid) values (?, ?)

Hibernate: insert into t_rights (mid, pid) values (?, ?)

Hibernate: insert into t_rights (mid, pid) values (?, ?)

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章