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 (?, ?)

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值