JSP开发之hibernate之单向多对一关联的实例

JSP开发之hibernate之单向多对一关联的实例

在Hibernate中,多对一关系是常见的一种关系,也是应用较广的关系之一。本文将讲解如何使用Hibernate实现单向多对一关联。

创建多对一关联的实体类

在Hibernate中,实现多对一关联关系时,需要定义一个实体类作为“多”的一方,在该实体类中声明一个关联的对象,使用引用类型(通常为另一个实体类的主键类型)来表示。举个例子,我们创建两个实体类OrderCustomer,创建多对一关联关系。其中,一个订单只能属于一个客户,而一个客户可以拥有多个订单,代码如下:

@Entity
@Table(name = "orders")
public class Order {
    @Id
    @GeneratedValue
    private Long id;

    private String orderNo;

    @ManyToOne
    @JoinColumn(name = "customerId")
    private Customer customer;
    // 省略getter/setter方法
}

@Entity
@Table(name = "customers")
public class Customer {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private String mobile;

    @OneToMany(mappedBy = "customer")
    private List<Order> orders;
    // 省略getter/setter方法
}

Order实体类中,使用了@ManyToOne注解表示多对一关联,同时在JoinColumn注解中指定了关联的外键名。在Customer实体类中,使用了@OneToMany注解表示一对多关联关系,mappedBy属性用于指明数据库中关联表中的对应字段。

创建DAO层代码

在Hibernate中,我们使用DAO层来完成对实体类的增删改查等操作。下面是DAO层代码的实现:

public class OrderDao {
    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public void save(Order order) {
        Session session = sessionFactory.getCurrentSession();
        session.save(order);
    }

    public Order getById(Long id) {
        Session session = sessionFactory.getCurrentSession();
        return session.get(Order.class, id);
    }
}

public class CustomerDao {
    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public void save(Customer customer) {
        Session session = sessionFactory.getCurrentSession();
        session.save(customer);
    }

    public Customer getById(Long id) {
        Session session = sessionFactory.getCurrentSession();
        return session.get(Customer.class, id);
    }
}

在DAO层代码中,我们使用SessionFactory来获取Session对象,然后使用Session对象完成对实体类的增删改查等操作。

创建Hibernate的配置文件

在使用Hibernate时,我们需要创建Hibernate的配置文件,用于指定数据库连接信息、实体类的映射关系等。下面是Hibernate的配置文件hibernate.cfg.xml的实现:

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test?useSSL=false</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">123456</property>
    <property name="hibernate.show_sql">true</property>
    <mapping class="com.example.model.Order" />
    <mapping class="com.example.model.Customer" />
  </session-factory>
</hibernate-configuration>

hibernate.cfg.xml中,我们指定了MySQL数据库的连接信息,同时也指定了实体类的映射关系。

测试Hibernate的多对一关联

下面是我们对Hibernate的多对一关联进行测试的代码:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-hibernate.xml"})
public class OrderDaoTest {
    @Autowired
    private OrderDao orderDao;

    @Autowired
    private CustomerDao customerDao;

    @Test
    public void testSaveOrderAndCustomer() {
        Customer customer = new Customer();
        customer.setName("张三");
        customer.setMobile("13912345678");
        customerDao.save(customer);

        Order order1 = new Order();
        order1.setOrderNo("20170001");
        order1.setCustomer(customer);
        orderDao.save(order1);

        Order order2 = new Order();
        order2.setOrderNo("20170002");
        order2.setCustomer(customer);
        orderDao.save(order2);

        Order order = orderDao.getById(order1.getId());
        assertNotNull(order);
        assertEquals("20170001", order.getOrderNo());
        assertEquals("张三", order.getCustomer().getName());
        assertEquals("13912345678", order.getCustomer().getMobile());
    }
}

在测试代码中,我们首先实例化了一个Customer对象并保存到数据库中,然后实例化了两个Order对象并关联到之前创建的Customer对象,最后通过OrderDao对数据库进行了操作,最后通过Assert对数据进行验证。

示例说明

下面是两个常见的多对一关联的示例:

一对多

在一个部门拥有多个员工的情况,一个员工只能属于一个部门,代码如下:

@Entity
@Table(name = "departments")
public class Department {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "department")
    private List<Employee> employees;
    // 省略getter/setter方法
}

@Entity
@Table(name = "employees")
public class Employee {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private String mobile;

    @ManyToOne
    @JoinColumn(name = "departmentId")
    private Department department;
    // 省略getter/setter方法
}

Department实体类中,使用了@OneToMany注解表示一对多关联,mappedBy属性用于指明数据库中关联表中的对应字段。在Employee实体类中,使用了@ManyToOne注解表示多对一关联,同时在JoinColumn注解中指定了关联的外键名。

多对一

在一个订单拥有多个商品的情况,一个商品只能属于一个订单,代码如下:

@Entity
@Table(name = "orders")
public class Order {
    @Id
    @GeneratedValue
    private Long id;

    private String orderNo;

    @ManyToOne
    @JoinColumn(name = "productId")
    private Product product;
    // 省略getter/setter方法
}

@Entity
@Table(name = "products")
public class Product {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private double price;

    @OneToMany(mappedBy = "product")
    private List<Order> orders;
    // 省略getter/setter方法
}

Order实体类中,使用了@ManyToOne注解表示多对一关联,同时在JoinColumn注解中指定了关联的外键名。在Product实体类中,使用了@OneToMany注解表示一对多关联,mappedBy属性用于指明数据库中关联表中的对应字段。

总结

本文通过一个实例,详细介绍了如何使用Hibernate实现单向多对一关联。实现步骤包括定义实体类、创建DAO层代码、创建Hibernate的配置文件,以及进行测试。同时,也给出了两种常见的多对一关联的示例,希望能够对大家掌握Hibernate的多对一关联关系有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP开发之hibernate之单向多对一关联的实例 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • 深入了解Java核心类库–Objects类

    深入了解Java核心类库–Objects类 Objects类是什么? 在Java的java.util包中,提供了一个Objects类,它是Java 7中加入的一个工具类,主要用于处理对象的一些通用操作,例如比较、哈希码等操作。 对象的比较 比较两个对象在Java中是一个非常常见的操作,Java中提供了两种方式来进行比较。 ==运算符 ==运算符比较的是两个…

    Java 2023年5月26日
    00
  • Java日期时间使用方法汇总

    Java日期时间使用方法汇总 1. 日期时间的格式化 在Java中,可以使用SimpleDateFormat类来格式化日期时间。SimpleDateFormat的常见格式符如下: 符号 含义 yyyy 年份 MM 月份 dd 日期 HH 小时 mm 分钟 ss 秒 下面是一个示例代码: import java.text.SimpleDateFormat; i…

    Java 2023年5月20日
    00
  • Java实现快速排序算法(Quicktsort)

    Java实现快速排序算法(Quicksort) 在本文中,将介绍如何使用Java语言实现快速排序算法。快速排序算法是一种经典的排序算法,其时间复杂度为O(nlogn),其实现方式类似于分治算法,通过选择基准值,将输入序列分为两个子序列,分别对其进行递归排序。 算法原理 快速排序算法被认为是最优秀的排序算法之一,因为它的时间复杂度为O(nlogn),它的核心思…

    Java 2023年5月19日
    00
  • Java实例讲解多态数组的使用

    Java实例讲解多态数组的使用 什么是多态数组 在Java中,多态数组是指一个数组中可以存储不同类型的对象。这是Java中面向对象编程中非常重要的一个特性。 如何声明多态数组 声明一个多态数组的语法格式为: Type[] array = new Type[N]; 其中,Type是多态数组可以存储的所有类型的父类,N是数组的长度。 同一个多态数组中可以存储多个…

    Java 2023年5月26日
    00
  • javascript之正则表达式基础知识小结

    JavaScript之正则表达式基础知识小结 正则表达式(Regular Expression)是一个用来处理文本的强大工具,具有非常丰富的语法和大量的用途,它可以用来处理文本的搜索、匹配、替换、验证等方面的问题。 正则表达式创建 在 JavaScript 中,正则表达式可以通过两种方式来创建: 1. 通过字面量形式创建 var reg = /ab+c/; …

    Java 2023年5月26日
    00
  • 新浪java面试经历与感慨分享

    新浪Java面试经历与感慨分享 背景介绍 该经历来自一位Java开发者在新浪公司的面试经历,分享该经历希望能够帮助其他准备面试的开发者,提高他们的面试成功率。 面试前准备 为了顺利通过面试,个人认为主要需要做好以下几个准备: 1. 掌握基础知识 在面试中,基础知识是最重要的。需要熟悉Java核心技术,如集合、IO流等,在掌握基本语法的基础上,对Java底层原…

    Java 2023年5月26日
    00
  • Java异常类型以及处理实例详解

    Java异常类型以及处理实例详解 什么是Java异常? 在Java中,异常是指程序在运行时发生错误的情况。当程序出现异常时,其会抛出一个Java异常对象,然后我们可以通过捕获(catch)异常对象来在代码中处理这些错误。 Java异常类型 在Java中,异常类型主要分为三种类型:未受检异常、受检异常和错误。 未受检异常(Unchecked Exception…

    Java 2023年5月26日
    00
  • 亲测有效解决Tomcat启动提示错误:At least one JAR was scanned for TLDs yet contained no TLDs

    首先,这个错误信息提示我们Tomcat扫描到了至少一个JAR文件,但是该JAR文件中没有包含任何的TLD文件。在这种情况下,Tomcat就无法识别出该JAR文件中的标签库,最终导致启动失败。 下面是解决这个问题的攻略步骤: 对于直接使用Tomcat的用户 可以在启动Tomcat之前,在Tomcat根目录下的conf目录找到Catalina/localhost…

    Java 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部