一、创建单独的表,(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 (?, ?)