• Hibernate 一对多关系操作


    这里使用类别Category和产品Product举例。

    Category与Product属于1:m 的关系,数据库如下:

    那么,实体设计如下:

    package com.sasa.domain;
    
    import java.util.Date;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    
    public class Category {
    
        public Category() {}
        
        private Integer id;
        private String c_name;
        private String descr;
        private Date create_tm;
        
        private Set<Product> Products = new HashSet<Product>();
        
        
        public Set<Product> getProducts() {
            return Products;
        }
        public void setProducts(Set<Product> products) {
            Products = products;
        }
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getC_name() {
            return c_name;
        }
        public void setC_name(String c_name) {
            this.c_name = c_name;
        }
        public String getDescr() {
            return descr;
        }
        public void setDescr(String descr) {
            this.descr = descr;
        }
        public Date getCreate_tm() {
            return create_tm;
        }
        public void setCreate_tm(Date create_tm) {
            this.create_tm = create_tm;
        }
        @Override
        public String toString() {
            return "Category [id=" + id + ", c_name=" + c_name + ", descr=" + descr + ", create_tm=" + create_tm
                    + ", Products=" + Products + "]";
        }
        
    }

    package com.sasa.domain;
    
    import java.time.LocalDateTime;
    
    public class Product {
        
        public Product() {}
        
        private Integer pid;
        private String pname;
        private Double price;
        private LocalDateTime create_tm;
        private Category category;
        
        public Category getCategory() {
            return category;
        }
        public void setCategory(Category category) {
            this.category = category;
        }
        public Integer getPid() {
            return pid;
        }
        public void setPid(Integer pid) {
            this.pid = pid;
        }
        public String getPname() {
            return pname;
        }
        public void setPname(String pname) {
            this.pname = pname;
        }
        public Double getPrice() {
            return price;
        }
        public void setPrice(Double price) {
            this.price = price;
        }
        
        public LocalDateTime getCreate_tm() {
            return create_tm;
        }
        public void setCreate_tm(LocalDateTime create_tm) {
            this.create_tm = create_tm;
        }
        @Override
        public String toString() {
            return "Product [pid=" + pid + ", pname=" + pname + ", price=" + price + ", create_tm=" + create_tm
                    + ", category=" + category + "]";
        }
        
        
        
    }

    配置文件:

    <?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="com.sasa.domain">
            <class name="Category" table="category">
                <id name="id" column="id">
                    <generator class="native"></generator>
                </id>
                <property name="c_name"></property>
                <property name="descr"></property>
                <property name="create_tm"></property>
                <set name="products">
                    <key column="category_id"></key>
                    <one-to-many class="Product"/>
                </set>
            </class>
        </hibernate-mapping>
        

    name:引用属性名

    column:外键名称

    class:与此类相关的类的完整类名

    <?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="com.sasa.domain">
            <class name="Product" table="product">
                <id name="pid" column="pid">
                    <generator class="native"></generator>
                </id>
                <property name="pname"></property>
                <property name="price"></property>
                <property name="create_tm"></property>
                <many-to-one name="category" column="category_id" class="Category"></many-to-one>
            </class>
        </hibernate-mapping>
        

    当设计好之后,就可以书写代码测试了:

    package com.sasa.service;
    
    import java.time.LocalDateTime;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.sasa.domain.Category;
    import com.sasa.domain.Product;
    import com.sasa.utils.HibernateUtils;
    
    public class CategoryService {
        @Test
        //新增类别和产品
        public void addCategorys(){
            Session session = HibernateUtils.getCurrentSession();
            Transaction tran = session.beginTransaction();
        //========================================
            Category category = new Category();
            category.setC_name("运动器材");
            category.setDescr("sport");
            
            Product p1 = new Product();
            p1.setPname("足球");
            p1.setPrice(100.00);
            
            Product p2 = new Product();
            p2.setPname("篮球");
            p2.setPrice(90.00);
            
            //一对多
            category.getProducts().add(p1);
            category.getProducts().add(p2);
            
            //多对一
            p1.setCategory(category);
            p2.setCategory(category);
            
            session.save(category);
            session.save(p1);
            session.save(p2);
        //==========================================    
            tran.commit();
            session.close();
            
        }
        
        
        //为类别增加产品
        public void addProductByCategory() {
            Session session = HibernateUtils.getCurrentSession();
            Transaction tran = session.beginTransaction();
            
            //====================================
            
            //1、获得要操作的类别  2、创建产品  3、将产品添加到类别,将类别设置到产品  4、执行保存
            Category category = session.get(Category.class, 9);
            
            Product product = new Product();
            product.setPname("羽毛球");
            product.setCreate_tm(LocalDateTime.now());
            product.setPrice(40.50);
            
            category.getProducts().add(product);
            product.setCategory(category);
            
            session.save(product);
            
            //====================================
            
            tran.commit();
            session.close();
        }
        
        
        //删除产品
        public void delProductByCategory() {
            Session session = HibernateUtils.getCurrentSession();
            Transaction tran = session.beginTransaction();
            
            //====================================
            
            //1、获得要操作的类别  2、获得要移除的产品  3、将产品从类别集合中移除 
            Category category = session.get(Category.class, 9);
            
            Product product = session.get(Product.class, 35);
            
            category.getProducts().remove(product);
            product.setCategory(null);//注意:数据库外键需设计为可空 这里的删除是将外键设置为null, 执行的是update,不执行delete
            
            //====================================
            //
            tran.commit();
            session.close();
        }
    
    }

    HibernateUtils.java:

    package com.sasa.utils;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtils {
    
        private static SessionFactory sessionFac;
        
        static {
            // Configuration 配置加载类,加载主配置,orm元数据加载
                    Configuration conf = new Configuration().configure();
                    // SessionFactory 创建用于操作数据库的Session工厂
                    // SessionFactory 负责保存和使用所有配置,消耗内存资源非常大
                    // 线程安全
                    // 保证在web项目中,只创建一个SessionFactory
                 sessionFac = conf.buildSessionFactory();
        }
        
        //获得Session
        //打开一个全新的Session
        public static Session openSession() {
            Session session = sessionFac.openSession();
            return session;
        }
    
        //获得线程上绑定的Session
        public static Session getCurrentSession() {
            Session session = sessionFac.getCurrentSession();
            return session;
        }
    
    }
  • 相关阅读:
    Mysql 创建用户并授权方法
    anyproxy 拦截响应
    Pycharm中加载和使用虚拟环境
    anyproxy 拦截发送请求
    微信小程序测试
    Django admin 后台管理
    Django简介
    Mysql root 密码忘记解决办法
    APP专项测试_启动性能分析
    Windows环境搭建Python虚拟环境
  • 原文地址:https://www.cnblogs.com/SasaL/p/11662045.html
Copyright © 2020-2023  润新知