一、創建單獨的表,(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中,進行單邊配置多對多關係。
- 指定生成中間表的名稱。在set中指定table屬性,生成的中間表的名字即爲t_rights。
- 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 (?, ?)