ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Hibernate 一对多关系操作

2019-10-12 16:01:50  阅读:194  来源: 互联网

标签:category tm Hibernate Category session import 操作 一对 public


 

这里使用类别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;
    }

}

 

标签:category,tm,Hibernate,Category,session,import,操作,一对,public
来源: https://www.cnblogs.com/SasaL/p/11662045.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有