首页 > Web开发 > 详细

hibernate多表操作

时间:2019-03-26 23:21:15      阅读:201      评论:0      收藏:0      [点我收藏+]

一、表之间的关系

  1.一对一

  2.一对多

  3.多对多

二、表之间关系建表原则

  1.一对多:在多的一方创建一个外键,指向一的一方的主键

  技术分享图片

  2.多对多:创建一个中间表,中间表至少有两个字段,分别作为外键指向多对多双方的主键

  技术分享图片

3.一对一:主键一一对应,或当成一对多来看待。

三、一对多实现

  1)定义

1.在1的domain类中定义:

private Set<link> links= new HashSet<>();
在相应映射配置文件中:
<!--一对多-->
<set name="links"><!--set属性名称-->
    <key column="link_cust_id"></key><!--外键-->
    <one-to-many class="com.ual.domain.link"></one-to-many>
</set>

如果想要保存记录的时候保存其级联的记录,需要在set 后添加

cascade="save-update"

2.在多的domain类中定义:

    //一个联系人只对应一个客户
    private  customer customer;

在相应映射配置文件中:

<many-to-one name="customer" class="com.ual.domain.customer" column="link_cust_id" insert="false" update="false" lazy="false"></many-to-one>

加入lazy="false"后,在查询时会把记录相关的外键对应的记录一起查询出来。

3.在核心配置文件中,把映射关系写入

<mapping resource="com/ual/domain/customer.hbm.xml"/><!--告诉hibernate要操作哪些表,写入映射的配置文件的全路径-->
        <mapping resource="com/ual/domain/link.hbm.xml"></mapping>

4.实现插入

@Test
    public void test(){
        Session session = HibernateUtil.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        customer c1 = new customer();
        c1.setCust_name("c1");
        customer c2= new customer();
        c2.setCust_name("c2");
        link link1 = new link();
        link1.setLink_name("link1");
        link link2 = new link();
        link2.setLink_name("link2");
        link link3 = new link();
        link3.setLink_name("link3");
        /*配置关系*/
        c1.getLinks().add(link1);
        c1.getLinks().add(link3);
        c2.getLinks().add(link2);
        link1.setCustomer(c1);
        link2.setCustomer(c2);
        link3.setCustomer(c1);
        /*保存联系人*/
        session.save(c1);
        session.save(c2);
        session.save(link1);
        session.save(link2);
        session.save(link3);

        transaction.commit();
    }

配置关系时,一般使用双向维护

2)查询

    @Test
    public void test2(){
        Session session = HibernateUtil.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        link link=session.get(com.ual.domain.link.class,6L);
        transaction.commit();
        System.out.println(link.getLink_name());
        System.out.println(link.getCustomer().getCust_name());
    }

注:

级联操作:

  1.问题:在两张表建立一对多关系时,如果只保存一边的对象,会引发异常

  2.级联操作:

    什么时级联操作:在操作一个对象时,是否会操作其关联的对象

    级联分类:  

      级联保存或更新:cascade="save-update"

      级联删除:cascade="delete,save-update"

    级联是有方向性的:保存的是谁就到谁里面做级联,删除的是谁就到谁里面做级联

3)更新

  

   @Test
    public void test4(){
        Session session = HibernateUtil.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        //更新
        link link=session.get(link.class,10L);
        customer customer=session.get(com.ual.domain.customer.class,13L);
        //10本来关联12,现让其关联13
        //双向维护
        customer.getLinks().add(link);
        link.setCustomer(customer);
        session.update(customer);
        transaction.commit();
    }

注: 由于使用的双向维护,两方同时去维护一个外键,会产生性能问题,可以让一方放弃维护外键,只让外键所在的表维护外键

  需要配置:在1的配置文件中:加inverse="true"

四、多对多关系实现

  

hibernate多表操作

原文:https://www.cnblogs.com/UalBlog/p/10604573.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!