Hibernate多表关联——(一对多关系)
hibernate是连接数据库使得更容易操作数据库数据的一个框架,在上一篇文章( 感兴趣的小伙伴点击这里📔’)中我们演示了单表建立查询。接触过数据库的都知道 关系型数据库表有三种关系, 一对一,一对多,多对多。而接下来我们在hibernate中建立 一对多关系,打开数据库。基于上一篇文章的表,接下来继续建立另外两个表的关系。这里创建两个实体类Custom和company,这两个表的关系就是: 一个公司有多名员工,一个员工只能属于一家公司,这里的多代表的就是员工,公司就是一。
1.分别在类中添加属性:
创建Coustoms.java
添加下列元素,分别创建set
和get
。
//员工类
private int lid;//员工id
private String name;//员工姓名
private String tel;//员工电话
private String gender;//员工性别
private Company company;//存入公司信息
//添加相应的get和set方法即可
同样的在company类中添加属性
private int cid;//公司id
private String name;//公司名称
private String address;//公司地址
//注意这里要创建一个集合用来保存和员工表之间的关系
Set<Custom> companySet = new HashSet<>();
//添加相应的get和set方法即可
2.hibernate建表
之后建立两个文件夹分别存放两个类的表结构,可以直接参照单表结构进行建立。custom.hbm.xml
与coustoms
表形成关系映射,与上一个文章相同,这里也需要创建关系映射map
。
添加相同头文件:
<?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">
对象与文件的映射:
<!--Custom表结构-->
<hibernate-mapping>
<class name="com.hbnu.pojo.Custom" table="tb_Custom">
<id name="lid">
<generator class="native"></generator>
</id>
<property name="name"/>
<property name="tel" />
<property name="gender"/>
<!--外键配置,此处非常关键 -->
<many-to-one name="company" class="com.hbnu.pojo.Company" column="clid"/>
</class>
</hibernate-mapping>
建立多表之间的联系时需要在建表时添加表的外键关系,这样才算表与表之间产生了联系。
而使用hibernate建立表时要注意,关系是建立在一对多的一个关系属性的表中,也就是这里的公司。
<!--Company表结构-->
<hibernate-mapping>
<class name="com.hbnu.pojo.Company" table="tb_company">
<id name="cid">
<generator class="native"></generator>
</id>
<property name="name" />
<property name="address" column="addr"></property>
<!--需要双方去维护的外键
column:外键名称
-->
<!--使用级联保存,在one中添加,在操作one的一方-->
<set name="companySet">
<key column="clid"></key>
<one-to-many class="com.hbnu.pojo.Company"/>
</set>
</class>
</hibernate-mapping>
创建完表,只需要随意使用一个测试类就可以看见表已经创建成功了。创建完成需要在hibernate.cfg.xml
进行声明。在上一篇文章中我们写入user.hbm.xml
声明。在hibernate.cfg.xml
中写入两个文件的路径。
<mapping resource="service/custom.hbm.xml"/>
<mapping resource="service/Company.hbm.xml"/>
连接数据库的封装
每次连接操作数据库时都需要创建对象连接,我们可以创建一个对象来封装数据库中的操作对象。
首先创建一个文件夹util
作为存放封装对象的文件夹。创建一个HibernateUtil
类对象里面封装三个方法:
1.解析hibernate配置文件,返回一个SessionFactory
2.获得SessionFactory中的session对象
3.关闭资源操作
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private Configuration configuration = null;
private SessionFactory sessionFactory = null;
private Session session = null;
//1.解析hibernate配置文件,返回一个SessionFactory
public SessionFactory getSessionFactory(){
configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
return sessionFactory;
}
//2.获得SessionFactory中的session对象
public Session getSession(){
session = getSessionFactory().openSession();
return session;
}
//3.关闭资源操作
private void clos (Session session,SessionFactory sessionFactory,Configuration configuration){
if(session != null){
session.close();
}
if(sessionFactory != null){
sessionFactory.close();
}
if(configuration != null){
sessionFactory.close();
}
}
}
需要使用数据库对象时,直接调用getSession()
。
3.使用测试类在表中添加数据
综合以上,两个表之间的关系已经搭建完成,接下来我们在表中添加数据。
@Test
//测试代码
public void testOneToManySave(){
Session session = HibernateUtil.getSession();
Customs customs1 = new Customs();
customs1.setName("百度");
customs1.setAddress("北京");
Customs customs2 = new Customs();
customs2.setName("腾讯");
customs2.setAddress("深圳");
company company1 = new company();
company1.setName("小李");
company1.setTel("18569655111");
company1.setGender("男");
company company2 = new company();
company2.setName("小顺");
company2.setTel("18569655222");
company2.setGender("男");
company company3 = new company();
company3.setName("小王");
company3.setTel("18569655333");
company3.setGender("男");
company company4 = new company();
company4.setName("小汤");
company4.setTel("18569655444");
company4.setGender("女");
company company5 = new company();
company5.setName("小明");
company5.setTel("18569655666");
company5.setGender("男");
//建立关系
customs1.getcompanySet().add(company1);
customs1.getcompanySet().add(company2);
customs1.getcompanySet().add(company3);
company1.setCustoms(customs1);
company2.setCustoms(customs1);
company3.setCustoms(customs1);
company4.setCustoms(customs2);
company5.setCustoms(customs2);
//保存数据
session.save(1);
session.save(customs2);
session.save(company1);
session.save(company2);
session.save(company3);
session.save(company4);
session.save(company5);
HibernateUtil.close(session,null,null);
}
在数据库中查看数据已经添加。
注意我这里表名有些出入,请遵守自己的代码即可。
级联操作
- 级联保存:当我们保存一方的数据时,可以自动保存多的一方,比如说公司中添加了一个员工,不需要在员工表中再添加一次,员工表会自动添加。
- 级联删除:当我们删除一方的数据以后,另一方的数据也会被删除。比如说一个公司需要注销,此时他的员工也会进行注销操作。
级联保存:cascade="save-update
添加该标签在外键关系中可以更加高效的添加数据,如图文章来源:https://www.toymoban.com/news/detail-408870.html
该标签页添加在customs
中。
如果再需要添加数据时就不需要将custom中数据进行save
(保存),保存company数据即可。
级联删除:delete
删除表中数据时就不需要将custom中数据进行delete
,直接删除company数据即可。
文章来源地址https://www.toymoban.com/news/detail-408870.html
到了这里,关于Hibernate多表关联——(一对多关系)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!