映射原理:
多的一端维护关联关系,在“多”的一端加入一个外键,指向“一”的一端。多的一端持有一的一端的引用,即在“多”的一端加外键,指向“一”的一端。
实例:
多个用户属于同一组,我们从对象模型和关系模型两个角度来分析一下这个例子:
从上图可以看出,对象模型具有方向性,通过用户(User)可以看到组(Group),但是不能反过来。用户和组各对应一张数据库表,聚合关系需要一个外键(groupid)来表示,最后生成的表如下所示:
作用:
当我拿到用户时直接就可以拿到用户的组,hibernate在访问多的一端时,可以自动的加载关联对象。对于用户(User)来说,它的关联对象是组(group)。
代码:
entity:
User类
package com.xia.entity;
public class User {
private int id;
private String name;
private group group;
public String toString() {
return "User 【id=" + id + ", name=" + name + ", group=" + group.toString() + "】";
}
//get,set方法
}
Groud类
package com.xia.entity;
public class group {
private int id;
private String name;
public String toString() {
return "group 【id=" + id + ", name=" + name + "】";
}
//get,set方法
}
xml:
User.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
[span style="color: rgba(0, 0, 255, 1)">class name="User" table="tb_user">
<!-- group属性,表达的是本对象与Group的多对一的关系--
Group.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
[span style="color: rgba(0, 0, 255, 1)">class //代码效果参考:http://www.lyjsj.net.cn/wz/art_23550.html
name="group" table="t_group">
将两个配置文件映射到sessionFactory中:
com/xia/entity/group.hbm.xml
com/xia/entity/User.hbm.xml
Test:自动建表及添加数据
package com.xia.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.xia.entity.User;
import com.xia.entity.group;
public class test {
//代码效果参考:http://www.lyjsj.net.cn/wx/art_23548.html
public static void main(String【】 args) {ApplicationContext ac = new ClassPathXmlApplicationContext("springContext.xml");
SessionFactory s = ac.getBean("sessionFactory",SessionFactory.class);
User u = new User();
u.setName("张三");
group g = new group();
g.setName("员工");
u.setGroup(g);
Session session = s.openSession();
session.beginTransaction();
session.save(g);
session.save(u);
session.getTransaction().commit();
session.close();
}
}
查询:
package com.xia.test;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.xia.entity.User;
public class test {
public static void main(String【】 args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("springContext.xml");
SessionFactory s = ac.getBean("sessionFactory",SessionFactory.class);
Session session = s.openSession();
Query query = session.createQuery("from User");
List list = query.list();
for(User u:list){
System.out.println(u.toString());
}
}
}
输出结果:
User 【id=0, name=张三, group=group 【id=1, name=员工】】