Hibernate的数据关联多对多

回顾:
1、一对多关联
2、一对一关联
 address.hbm.xml
 
<one-to-one name="person" class="entity.TPerson" cascade="all" property-ref="TAddress"/>        
person.hbm.xml(没有变化)
 
   <many-to-one name="TAddress" class="entity.TAddress" fetch="select">
            <column name="addressid" />
        </many-to-one> 
TAddressDAO.java
 
public class TAddressDAO {
 Session session = null;
 SessionFactory sessionFactory = null;
 Transaction trans = null;

 /**
  *  验证查询
  */
 public void QueryAddress(int id) {
  session = HibernateSessionFactory.getSession();
  trans = session.beginTransaction();
        TAddress address=(TAddress)session.get(TAddress.class, id);
        System.out.println(address.getPerson().getUsername());
  trans.commit();
  HibernateSessionFactory.closeSession();
 } 
 /**
  * 验证关联添加
  */
 public void AddAddress() {
  session = HibernateSessionFactory.getSession();
  trans = session.beginTransaction();
        TAddress address=new TAddress();
     address.setCity("长沙");
     TPerson person=new TPerson();
     person.setUsername("小明");
     person.setTAddress(address);
     address.setPerson(person);
      //session.save(person);
     session.save(address);
  trans.commit();
  HibernateSessionFactory.closeSession();
 }
  /**
     * 验证关联删除
     */
 public void deleteAddress(int id) {
  session = HibernateSessionFactory.getSession();
  trans = session.beginTransaction();
        TAddress address=(TAddress)session.get(TAddress.class,id);
     session.delete(address);
  trans.commit();
  HibernateSessionFactory.closeSession();
 }
   /**
     * 验证关联更新
     */
 public void UpdateAddress(int id) {
  session = HibernateSessionFactory.getSession();
  trans = session.beginTransaction();
        TAddress address=(TAddress)session.get(TAddress.class,id);
        address.setCity("南京");
        System.out.println(address.getCity());
        TPerson person=(TPerson)address.getPerson();
        person.setUsername("小白");
        session.update(address);
        trans.commit();
  HibernateSessionFactory.closeSession();
 }

 


                Hibernate的数据关联多对多
目标:
 讲解程序的Hibernate的数据关联多对多关系
难度:★★★☆☆

内容:
关联映射
级联操作(4种业务)

一、关联映射

数据库
 
create table Address
(
   addressId  int identity(1,1) primary key,
   city       varchar(10)
)

create table Person
(
   personId     int identity(1,1) primary key,
   personName   varchar(10)
)
create table PersonAddress
(
   personId   int foreign key references  Person(personId),
   addressId  int foreign key references  Address(addressId)
)

drop table PersonAddress
drop table Person
drop table Address
delete from PersonAddress

select * from PersonAddress
select * from Address
select * from Person

insert into Person values('张三');
insert into Person values('李四');
insert into Person values('王五');

insert into Address values('北京');
insert into Address values('上海');
insert into Address values('长沙');

 

address.hbm.xml
 
       <set name="persons"  table="PersonAddress" inverse="true">
            <key>
                <column name="addressId"/>
            </key>
            <many-to-many class="entity.Person" column="personId"/>
        </set> 

person.hbm.xml
 
 
        <set name="addresses"  table="PersonAddress">
            <key>
                <column name="personId"/>
            </key>
            <many-to-many class="entity.Address" column="addressId"/>
        </set> 


二、级联操作
测试类:AddressDAO.java

 
public class AddressDAO {
    Session session=null;
    SessionFactory sessionFactory=null;
    Transaction trans=null;
    /**
    * 录入某人员的房屋信息:该人员在两个地方有房屋
    * 前提:数据库中已存在"1"和"2"地区
    */
     public void addPersonAndAddress() {
       session=HibernateSessionFactory.getSession();
         trans=session.beginTransaction();
        
         Address address1=(Address)session.get(Address.class, 1);
         Address address2=(Address)session.get(Address.class, 2);
         Person  person=(Person)session.get(Person.class, 1);
        
         person.getAddresses().add(address1);
         person.getAddresses().add(address2);
        
         address1.getPersons().add(person);
         address2.getPersons().add(person);
        
         session.save(person);

         trans.commit();
         HibernateSessionFactory.closeSession();
     } 
      
     
     /**
      * 查询产品"1",及其房屋所在地区信息
      */
     public void queryPersonAndAddress(int id) {
        session=HibernateSessionFactory.getSession();
        Person  person=(Person)session.get(Person.class, id);
             Set addresses=person.getAddresses();
             Iterator i=addresses.iterator();
             while(i.hasNext()){
             Address  address=(Address)i.next();
             System.out.println(address.getCity()); 
             }
        HibernateSessionFactory.closeSession();
     }
     
     /**
      * 修改人员"1"的房屋信息,改为3号,只在"长沙"有房屋
      * 这属于多对多只删除中间表操作
      */
     public void updateAdress() {
       session=HibernateSessionFactory.getSession();
            trans=session.beginTransaction();

       Person person = (Person)session.get(Person.class, 1);
       Address address3= (Address)session.get(Address.class, 3);
       Set addresses =person.getAddresses();
       for (Iterator iter = addresses.iterator(); iter.hasNext();) {
        Address address = (Address)iter.next();
        //注意.remove()必须操作持久对象
        //person.getAddresses().remove(address);//不可以
        address.getPersons().remove(person);
        iter.remove();
        }
       person.getAddresses().add(address3);  
       address3.getPersons().add(person);
       

       session.update(person);
       
            trans.commit();
            HibernateSessionFactory.closeSession(); 
     }
     
     /**
      * 测试inverse="true"在多对多关系中的含义
         * 步骤一:在Address.hbm.xml或Person.hbm.xml中去掉映射多对多关系的,<set>节点中的inverse="true"属性
      * 步骤二:执行该方法,观察数据库中间表的记录
      *
      */
     public void testInverse() {
       session=HibernateSessionFactory.getSession();
          trans=session.beginTransaction();
   Person person = (Person)session.get(Person.class, 2);
   Address address1= (Address)session.get(Address.class, 1);
     
   person.getAddresses().add(address1);
   address1.getPersons().add(person);
   
      session.save(person); 
       trans.commit();
       HibernateSessionFactory.closeSession(); 
    
     }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值