回顾:
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();
}
}