核心思想:
数据库表对应java类(表-类),表的字段对应类的属性(字段-属性)
关联:把数据库中的外键映射,变成对象的关联关系。
多对一,一对多,一对一,多对多
单向,双向
一、单向,多对一(Info,Nation多个人有同一个民族)
准备两个基本类和映射文件
1.给类加关联对象
import java.util.Date;
public class Info {
private String code;
private String name;
private Boolean sex;
private Date birthday;
private Nation nationObj;//给类加关联对象。添加一个成员nationObj,并生成getter和setter
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Nation getNationObj() {
return nationObj;
}
public void setNationObj(Nation nationObj) {
this.nationObj = nationObj;
}
}
public class Nation {
private String code;
private String name;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.给hbm.xml文件加关联映射
给Info.hbm.xml加上<many-to-one>
<many-to-one name="nationObj" column="nation"></many-to-one>
<?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="maya.model">
<class name="Info" table="Info">
<id name="code" type="java.lang.String">
<column name="code" />
<generator class="assigned"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" />
</property>
<property name="sex" type="java.lang.Boolean">
<column name="sex" />
</property>
<property name="birthday" type="java.util.Date">
<column name="birthday" />
</property>
<!--加上<many-to-one> -->
<!--column:列,class:类名, cascade="save-update",加这个配置属性目的是,many表和one表一起更新 -->
<many-to-one name="nationObj" column="nation" class="Nation" cascade="save-update">
</many-to-one>
</class>
</hibernate-mapping>
注意:
1.主要针对的是哪个对象? --- Info
2.主表是谁?从表是谁?主表是约束别人的,从表是被约束的。 外键在从表上。
主表是nation,从表是info
3.在实体类中,外键属性与关联对象,留一个就可以。在hbm.xml文件中,外键属性与<many-to-one>也留一个就可以。
如果两个都保留,记得在<many-to-one>上加上两个属性insert=false,update=false。
4.一般需要加上cascade="save-update",加这个配置业属性目的是,many表和one表一起更新
二、单向,一对一(Login和Info)
准备两个一对一的表和类
1.给类加关联对象
给Login加上infoObj属性
public class Login {
private int ids;
private String userName;
private String password;
private Info infoObj;
public int getIds() {
return ids;
}
public void setIds(int ids) {
this.ids = ids;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Info getInfoObj() {
return infoObj;
}
public void setInfoObj(Info infoObj) {
this.infoObj = infoObj;
}
}
2.给Login.hbm.xml加上<many-to-one>配置
<many-to-one name="infoObj" column="infoCode" unique="true"/>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-3-4 12:27:40 by Hibernate Tools 5.2.1.Final -->
<hibernate-mapping>
<class name="maya.model.Login" table="Login"><!-- 上面的hibernate-mapping不带包的路径,class就得带类的路径,下同 -->
<id name="ids" type="int">
<column name="ids" />
<generator class="native"></generator>
</id>
<property name="userName" type="java.lang.String">
<column name="userName" />
</property>
<property name="password" type="java.lang.String">
<column name="password" />
</property>
<!-- unique的意思是唯一性 -->
<many-to-one name="infoObj" column="InfoCode" class="maya.model.Info" unique="true">
</many-to-one>
</class>
</hibernate-mapping>
三、单向,一对多(Info,Work)
1.给类加关联对象(集合对象)
private Set<Work> works;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class Info {
private String code;
private String name;
private Boolean sex;
private Date birthday;
private Nation nationObj;
private Set<Work> works = new HashSet<Work>(0);//给类加关联对象(集合对象)
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Nation getNationObj() {
return nationObj;
}
public void setNationObj(Nation nationObj) {
this.nationObj = nationObj;
}
public Set<Work> getWorks() {
return works;
}
public void setWorks(Set<Work> works) {
this.works = works;
}
}
import java.util.Date;
public class Work {
private int ids;
private String infoCode;
private Date startDate;
private Date endDate;
private String firm;
private String depart;
private int orders;
private Info infoObj;//
public int getIds() {
return ids;
}
public void setIds(int ids) {
this.ids = ids;
}
public String getInfoCode() {
return infoCode;
}
public void setInfoCode(String infoCode) {
this.infoCode = infoCode;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public String getFirm() {
return firm;
}
public void setFirm(String firm) {
this.firm = firm;
}
public String getDepart() {
return depart;
}
public void setDepart(String depart) {
this.depart = depart;
}
public int getOrders() {
return orders;
}
public void setOrders(int orders) {
this.orders = orders;
}
public Info getInfoObj() {
return infoObj;
}
public void setInfoObj(Info infoObj) {
this.infoObj = infoObj;
}
}
2.给Info.hbm.xml配置
<set name="实体类中集合成员的变量名(works)">
<one-to-many class="Work">
<key column="infoCode">
</set>
<?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="maya.model">
<class name="Info" table="Info">
<id name="code" type="java.lang.String">
<column name="code" />
<generator class="assigned"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" />
</property>
<property name="sex" type="java.lang.Boolean">
<column name="sex" />
</property>
<property name="birthday" type="java.util.Date">
<column name="birthday" />
</property>
<set name="works" table="Work" cascade="save-update" ><!-- name="实体类中集合成员的变量名(works)"-->
<key>
<column name="infoCode" />
</key>
<one-to-many class="Work" />
</set>
</class>
</hibernate-mapping>
四、多对多(Student和Course,中间表Score)
数据库中没有多对多的关系。只有程序里面有。数据库中是使用两个一对多和多对一来实现多对多的。典型的是:中间表
在程序中,如果中间表中没有其它信息,那就可以不用写中间表的实体类。
多对多,还可以用在:用户和角色的关系上。
1.给类加关联对象(集合对象)
import java.util.Date;
import java.util.Set;
public class Student {
private String sno;
private String sname;
private String ssex;
private Date sbirthday;
private String sclass;
private Set<Course> courses;
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
}
public Date getSbirthday() {
return sbirthday;
}
public void setSbirthday(Date sbirthday) {
this.sbirthday = sbirthday;
}
public String getSclass() {
return sclass;
}
public void setSclass(String sclass) {
this.sclass = sclass;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
}
import java.util.Set;
public class Course {
private String cno;
private String cname;
private String tno;
private Set<Student> students;
public String getCno() {
return cno;
}
public void setCno(String cno) {
this.cno = cno;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getTno() {
return tno;
}
public void setTno(String tno) {
this.tno = tno;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
2.给hbm.xml配置
<set name="当前类的集合属性" table="中间表">
<key column="中间表中与此表对应的外键"></key>
<many-to-many class="另外多方对象的类名" column="另外多方对象在中间表中的外键"></many-to-many>
</set>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-3-4 12:27:40 by Hibernate Tools 5.2.1.Final -->
<hibernate-mapping package="maya.model">
<class name="Course" table="Course">
<id name="cno" type="java.lang.String">
<generator class="assigned"></generator>
</id>
<property name="cname"/>
<property name="tno" />
<set name="students" table="score">
<key column="cno"></key>
<many-to-many class="Student" column="sno"></many-to-many>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-3-4 12:27:40 by Hibernate Tools 5.2.1.Final -->
<hibernate-mapping package="com.itnba.maya.model">
<class name="Student" table="Student">
<id name="sno" type="java.lang.String">
<generator class="assigned"></generator>
</id>
<property name="sname"/>
<property name="ssex" />
<property name="sbirthday" />
<property name="sclass" column="class" />
<set name="courses" table="score">
<key column="sno"></key>
<many-to-many class="Course" column="cno"></many-to-many>
</set>
</class>
</hibernate-mapping>
来源:https://www.cnblogs.com/jonsnow/p/6504708.html