本章代码:https://github.com/MarsOu1998/ForeignKeyHibernate
1.创建PO之间的联系
在Hibernate框架之中,PO对象关系层通过映射文件和配置文件得以注册,再利用HibernateAPI支持就可以完成一些对数据库的操作。那么PO和PO之间是否可以创建联系,让他们协作呢,答案是可以的。
在数据库之中,表与表之间的关系有三种——一对一、一对多、多对多。那么PO之间也可以做到这样的关联。
2. 一对一关联:one-to-one
题目:学校和校长是一对一的关系,要求实现:对学校的信息进行查询的时候,无需另外查询就可以得到校长的信息。
步骤:
- 建立POJO:School.java,Header.java,建立Hibernate配置文件,将两个hbm文件与其绑定。
- 在School.java里面建立一个Header类型的属性.
- 在School的hbm文件里面增加
<one-to-one name="header 属性名称" class="header属性类" cascade="all|none(是否级联)/>
假设数据库里面school表的主键是schoolID,header表里面的主键是headerId,利用Hibernate查询学校时,其实校长的信息是弹不出来的。
Query1.java:
import PO.School;
import org.hibernate.Session;
public class Query1 {
public static void main(String[] args) {
Session session=util.HibernateSessionFactory.getSession();
School school=(School)session.get(School.class,1);
System.out.println(school.getSchoolName());
System.out.println(school.getHeader());
util.HibernateSessionFactory.closeSession();
}
}
输出会发现校长的名字为null
原因如下:
系统在查找的时候并不是找schoolId=schoolId,而是去找schoolId=headerId,所以找不到。
原因是在header的映射文件里面,主键是headerId,只需要把主键修改为schoolId,这个问题即可解决。
Query.java:
package Test;
import PO.School;
import org.hibernate.Session;
public class Query1 {
public static void main(String[] args) {
Session session=util.HibernateSessionFactory.getSession();
School school=(School)session.get(School.class,1);
System.out.println(school.getSchoolName());
System.out.println(school.getHeader().getHeaderName());
util.HibernateSessionFactory.closeSession();
}
}
Header.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="PO.Header" table="header">
<id name="schoolId" column="schoolId" >
<generator class="assigned"></generator>
</id>
<property name="headerName" column="headerName" ></property>
<property name="headerId" column="headerId"></property>
</class>
</hibernate-mapping>
Student.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="PO.School" table="school">
<id name="schoolId" column="schoolId" >
<generator class="assigned"></generator>
</id>
<property name="schoolName" column="schoolName" ></property>
<one-to-one name="header" class="PO.Header" cascade="all"></one-to-one>
</class>
</hibernate-mapping>
Student.java:
package PO;
public class School {//查询学校要知道校长,需要在这里设置校长的属性。
private int schoolId;
private String schoolName;
private Header header;
public int getSchoolId() {
return schoolId;
}
public void setSchoolId(int schoolId) {
this.schoolId = schoolId;
}
public String getSchoolName() {
return schoolName;
}
public void setSchoolName(String schoolName) {
this.schoolName = schoolName;
}
public Header getHeader() {
return header;
}
public void setHeader(Header header) {
this.header = header;
}
}
Header.java:
package PO;
public class Header {
private int headerId,schoolId;
private String headerName;
public int getHeaderId() {
return headerId;
}
public void setHeaderId(int headerId) {
this.headerId = headerId;
}
public int getSchoolId() {
return schoolId;
}
public void setSchoolId(int schoolId) {
this.schoolId = schoolId;
}
public String getHeaderName() {
return headerName;
}
public void setHeaderName(String headerName) {
this.headerName = headerName;
}
}
效果如下:
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20190822141647649.png)
同理,也可以修改校长的信息:
Update.java:
~~~java
package Test;
import PO.School;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class Update {
public static void main(String[] args) {
Session session=util.HibernateSessionFactory.getSession();
School school=(School)session.get(School.class,3);
school.getHeader().setHeaderName("欧世乐");
Transaction transaction=session.beginTransaction();
session.update(school);
transaction.commit();
util.HibernateSessionFactory.closeSession();
}
}
同理也可以删除信息,两个表的内容会一起删除。
Delete.java
package Test;
import PO.School;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class Delete {
public static void main(String[] args) {
Session session=util.HibernateSessionFactory.getSession();
School school=(School)session.get(School.class,2);
session.delete(school);
Transaction transaction=session.beginTransaction();
transaction.commit();
util.HibernateSessionFactory.closeSession();
}
}
同理,还可以添加:
Insert.java:
package Test;
import PO.Header;
import PO.School;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class Insert {
public static void main(String[] args) {
Session session=util.HibernateSessionFactory.getSession();
School school=new School();
school.setSchoolId(4);
school.setSchoolName("同济大学");
Header header=new Header();
header.setHeaderName("章华");
header.setHeaderId(7);
header.setSchoolId(4);
school.setHeader(header);
Transaction transaction=session.beginTransaction();
session.save(school);
transaction.commit();
util.HibernateSessionFactory.closeSession();
}
}
会在两个表内插入数据信息,这就是一对一的关系。