Hibernate多表查询分为单向和双向:
单向的意思是:只能从A表查询B表的数据,而不能从B表反过来查A表的数据。
双向的意思则是:既能从A表查询到B表,反过来能可以从B表查到A表的数据。
好,接下来我们开始写多表查询:
单向之多对一
1、先创建工具类:HibernateUtil:
public class HibernateUtilEX {
private static Configuration configuration = null;
private static SessionFactory sessionFactory = null;
// 本地化线程、
private static ThreadLocal<Session> localSession = null;
static {
try {
// 加载Hibernate配置文件(默认加载bihernate.cfg.xml)
configuration = new Configuration().configure();
// 获取SessionFactory工厂对象
sessionFactory = configuration.buildSessionFactory();
localSession = new ThreadLocal<Session>();
} catch (Exception e) {
System.out.println("加载hibernate映射文件失败");
e.printStackTrace();
}
}
/**
* 得到Session对象
*
* @return Session
*/
public static Session openSession() throws HibernateException {
// 底层有一个Map<k,V>,K:线程ID,V:session ,一个线程绑定一个session
Session session = localSession.get();
if (session == null) {
session = sessionFactory.openSession();
localSession.set(session);
}
return session;
}
/**
* 关闭Session
*
* @throws HibernateException
*/
public static void closeSession() throws HibernateException {
Session session = localSession.get();
if (session != null) {
session.close();
}
localSession.set(null);
}
}
这里举例;乘客乘公交
2、先建两个实体类:公交实体类:BusEntity
public class BusEntity {
private int id;
private String route; // 路线
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getRoute() {
return route;
}
public void setRoute(String route) {
this.route = route;
}
@Override
public String toString() {
return "BusEntity [id=" + id + ", route=" + route + "]";
}
}
配置文件:BusEntity.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zh.entity">
<class name="BusEntity" table="t_bus">
<!-- 映射标识属性(属性) -->
<id name="id" column="id" type="int">
<!-- 主键生成策略(自增主键) -->
<generator class="native" />
</id>
<!-- 映射普通属性 -->
<property name="route" column="route"></property>
</class>
</hibernate-mapping>
乘客实体类:PassengerEntity
public class PassengerEntity {
private int id;
private String name;// 乘客姓名
private String destination;// 目的地
private BusEntity bus; // 乘坐Bus
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDestination() {
return destination;
}
public void setDestination(String destination) {
this.destination = destination;
}
public BusEntity getBus() {
return bus;
}
public void setBus(BusEntity bus) {
this.bus = bus;
}
@Override
public String toString() {
return "Passenger [id=" + id + ", name=" + name + ", destination=" + destination + ", bus=" + bus + "]";
}
}
配置文件:BusEntity.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zh.entity">
<class name="PassengerEntity" table="t_passenger">
<!-- 映射标识属性(属性) -->
<id name="id" column="id" type="int">
<!-- 主键生成策略(自增主键) -->
<generator class="native" />
</id>
<!-- 映射普通属性 -->
<property name="name" column="name"></property>
<property name="destination" column="destination"></property>
<!-- 单向多对一关联映射 (cascade表示级联操作,all表示ZSGC都采用,none表示不级联) -->
<many-to-one name="bus" class="BusEntity" column="bus_id" cascade="all"></many-to-one>
</class>
</hibernate-mapping>
3、在总配置文件hibernate.cfg.xml里添加配置映射文件
4、创建测试类:HibernateTest
public class HibernateTest {
// 单向多对一测试
public void SingleManyToOneTest() {
// 创建session会话
Session session = HibernatUtil.getSession();
// 打开事物
Transaction transaction = session.beginTransaction();
/**
* 创建乘客实体类1
*/
PassengerEntity passenger = new PassengerEntity();
passenger.setName("张三");
passenger.setDestination("春熙路公交站");
/**
* 创建乘客实体类2
*/
PassengerEntity passenger2 = new PassengerEntity();
passenger2.setName("李四");
passenger2.setDestination("红星路公交站");
/**
* 创建公交实体类
*/
BusEntity bus = new BusEntity();
bus.setRoute("102路");
//实体类获取Bus属性
// 因为我们在配置中使用了级联属性,所以这里passenger只需要设置一次属性,数据库则会关联两个乘客
passenger.setBus(bus);
//保存到数据库
session.persist(passenger);
session.persist(passenger2);
//事物提交
transaction.commit();
//关闭会话
HibernatUtil.closeSession(session);
}
}
添加成功!
对应数据数:
联表查询,体现的是类与类之间的关系,所以关键之处在于理解实体类之间谁是多的一方,谁是单独的一方!