利用hibernate实现数据库对象关联(多对一对多一对多对多)
Posted 囧雪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用hibernate实现数据库对象关联(多对一对多一对多对多)相关的知识,希望对你有一定的参考价值。
核心思想:
数据库表对应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>
以上是关于利用hibernate实现数据库对象关联(多对一对多一对多对多)的主要内容,如果未能解决你的问题,请参考以下文章