hibernate中的对象关系映射

Hibernate是一个Java开源框架,它提供了一种旨在使用面向对象的方式来操作数据库的方法,其中对象关系映射(ORM)是Hibernate的核心。具体来说,Hibernate可以将Java类映射到数据库中的关系型表,并通过一系列简单易懂的配置,自动将Java对象与数据库操作关联起来。

下面是使用Hibernate进行对象关系映射的完整攻略:

1. 配置Hibernate

在项目中引入Hibernate框架,添加相关依赖包(例如hibernate-core、hibernate-entitymanager等)到项目的类路径中。同时,在项目的配置文件中设置相关的Hibernate属性,例如数据源、连接池、缓存等。

2. 创建实体类

创建Java实体类,并在实体类中指定与数据库中的表对应的表名、主键等信息。同时,在实体类中指定类的属性与表的列之间的映射关系,例如使用注解或XML文件来进行映射配置。

例如,我们创建一个Person类,并将其与数据库中的person表进行映射:

@Entity
@Table(name = "person")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private Integer age;

    // 省略getter和setter方法
}

在上述代码中,@Entity注解表示这是一个实体类,@Table注解指定该类对应的表名,@Id注解指定该字段为主键,@GeneratedValue注解指定主键的生成方式。@Column注解指定该属性对应的列名。

3. 创建Hibernate SessionFactory

使用Hibernate SessionFactory来创建Session对象,Session对象用于执行对实体类对象的持久化操作。SessionFactory是线程安全的,通常情况下应该在应用程序的启动阶段只创建一次。

例如,在Java中创建SessionFactory:

Configuration configuration = new Configuration()
    .configure("hibernate.cfg.xml");
SessionFactory sessionFactory = configuration.buildSessionFactory();

在上述代码中,Configuration对象用于读取Hibernate的配置文件,configure方法指定该文件的路径。buildSessionFactory方法用于创建SessionFactory对象。

4. 通过Session执行CRUD操作

使用Session对象来执行对实体类的持久化操作,包括创建、读取、更新和删除实体。

例如,创建一个新的Person对象并将其保存到数据库中:

Session session = sessionFactory.openSession();
session.getTransaction().begin();
Person person = new Person();
person.setName("Tom");
person.setAge(20);
session.save(person);
session.getTransaction().commit();
session.close();

在上述代码中,首先通过SessionFactory创建Session对象。然后通过调用beginTransaction方法开启一个事务。接着创建一个新的Person对象,并通过调用save方法将其保存到数据库中。最后调用commit方法提交事务,并关闭Session对象。

示例1 - 一对多关系映射

下面是一个一对多关系的示例,其中一个订单(Order)可以包含多个订单项(OrderItem)。在这个示例中,一个订单项只属于一个订单,而一个订单可以包含多个订单项。

1. 创建实体类

创建Order和OrderItem两个实体类,并且在实体类之间相互引用。

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

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<OrderItem> items = new ArrayList<>();

    // 省略getter和setter方法
}

@Entity
@Table(name = "orderitems")
public class OrderItem {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "product_name")
    private String productName;

    @Column(name = "price")
    private Double price;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "order_id")
    private Order order;

    // 省略getter和setter方法
}

在上述代码中,Order类中使用@OneToMany注解指定了实体类之间的一对多关系,指定了items属性、order属性的名称映射关系、级联操作和孤儿删除。而OrderItem类中使用@ManyToOne注解指定了实体类之间的多对一关系,指定了order属性与外键的映射关系。

2. 通过Session执行CRUD操作

利用Hibernate API,可以通过Session对象来执行对实体类的CRUD操作。下面是一个增删查改的示例:

// 添加新订单
Session session = sessionFactory.openSession();
Transaction tx = session.getTransaction();
tx.begin();

Order order = new Order();
order.setItems(new ArrayList<>());

OrderItem item1 = new OrderItem();
item1.setProductName("iPhone 12");
item1.setPrice(1199.0);
item1.setOrder(order);

OrderItem item2 = new OrderItem();
item2.setProductName("MacBook Air");
item2.setPrice(999.0);
item2.setOrder(order);

order.getItems().add(item1);
order.getItems().add(item2);
session.save(order);

tx.commit();
session.close();

// 修改订单
Session session = sessionFactory.openSession();
Transaction tx = session.getTransaction();
tx.begin();

Order order = session.get(Order.class, 1L);
order.getItems().get(0).setPrice(1100.0);
session.update(order);

tx.commit();
session.close();

// 查询订单
Session session = sessionFactory.openSession();
Transaction tx = session.getTransaction();
tx.begin();

Order order = session.get(Order.class, 1L);
System.out.println(order);

tx.commit();
session.close();

// 删除订单
Session session = sessionFactory.openSession();
Transaction tx = session.getTransaction();
tx.begin();

Order order = session.get(Order.class, 1L);
session.delete(order);

tx.commit();
session.close();

在上述代码中,我们使用Session对象执行增加、查找、修改和删除实体对象。具体来说,我们创建了一个包含了两个OrderItem的Order对象,并将其保存到数据库中。然后我们通过get方法从数据库中查询到Order对象并修改了其中第一个订单项的价格。接着我们再次使用get方法从数据库中查询到Order对象并打印出来。最后,我们通过删除Order对象来删除Order和OrderItem对象。

示例2 - 多对多关系映射

下面是一个多对多关系的示例,其中一个学生(Student)可以报读多个课程(Course),而一个课程也可以有多个学生报读。

1. 创建实体类

创建Student和Course两个实体类,并且在实体类之间相互引用。

@Entity
@Table(name = "students")
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
        name = "enrollments",
        joinColumns = @JoinColumn(name = "student_id"),
        inverseJoinColumns = @JoinColumn(name = "course_id")
    )
    private Set<Course> courses = new HashSet<>();

    // 省略getter和setter方法
}

@Entity
@Table(name = "courses")
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @ManyToMany(mappedBy = "courses")
    private Set<Student> students = new HashSet<>();

    // 省略getter和setter方法
}

在上述代码中,Student类中,使用@ManyToMany注解指定实体类之间的多对多关系,指定了courses属性和表名,由于Student被认为是关系的拥有者,所以使用了@JoinTable注解来映射成一个中间表,并指明该表对应的列名。而在Course类中,使用@ManyToMany注解指定实体类之间的多对多关系,同时使用mappedBy指定 Student 的 Set 属性(实体类中)表示与此类相关联。

2. 通过Session执行CRUD操作

利用Hibernate API,可以通过Session对象来执行对实体类的CRUD操作。下面是一个增删查改的示例:

// 添加新学生
Session session = sessionFactory.openSession();
Transaction tx = session.getTransaction();
tx.begin();

Course course1 = new Course();
course1.setName("Java Programming");

Course course2 = new Course();
course2.setName("Database Design");

Student student = new Student();
student.setName("Tom");
student.setCourses(new HashSet<>());

student.getCourses().add(course1);
student.getCourses().add(course2);

session.save(student);

tx.commit();
session.close();

// 修改学生课程
Session session = sessionFactory.openSession();
Transaction tx = session.getTransaction();
tx.begin();

Student student = session.get(Student.class, 1L);
Course course = session.get(Course.class, 2L);

student.getCourses().add(course);
session.update(student);

tx.commit();
session.close();

// 查询学生课程
Session session = sessionFactory.openSession();
Transaction tx = session.getTransaction();
tx.begin();

Student student = session.get(Student.class, 1L);
System.out.println(student);

tx.commit();
session.close();

// 删除学生课程
Session session = sessionFactory.openSession();
Transaction tx = session.getTransaction();
tx.begin();

Student student = session.get(Student.class, 1L);
student.getCourses().remove(course);
session.update(student);

tx.commit();
session.close();

在上述代码中,我们使用Session对象执行增加、查找、修改和删除实体对象。具体来说,我们创建了一个包含了两个Course的Student对象,并将其保存到数据库中。然后我们通过get方法从数据库中查询到Student对象,并将第一个学生和第二个课程关联。接着我们再次使用get方法从数据库中查询到Student对象并打印出来。最后,我们通过update方法来删除Student对象中的一门课程。

以上就是Hibernate中的对象关系映射攻略,通过详细的配置过程和示例代码即使您是初学者也可以快速上手。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:hibernate中的对象关系映射 - Python技术站

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

相关文章

  • java实现简单日期计算功能

    下面我就给您讲解一下Java实现简单日期计算功能的完整攻略。 步骤一:引入相关类库 在Java中,要实现日期计算功能首先需要用到java.util包中的Date类和Calendar类。因此,我们需要在代码中引入这两个类: import java.util.Calendar; import java.util.Date; 步骤二:获取当前日期 获取当前日期可以…

    Java 2023年5月20日
    00
  • java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案例

    让我给您详细讲解一下关于Java多线程中CountDownLatch与线程池ThreadPoolExecutor/ExecutorService的用法及案例的完整攻略。这里会分为以下几个部分: 什么是CountDownLatch以及用途 CountDownLatch的用法示例 什么是线程池ThreadPoolExecutor/ExecutorService以…

    Java 2023年5月19日
    00
  • java基础之数组常用操作总结(必看篇)

    Java基础之数组常用操作总结(必看篇) 一、什么是数组 数组是一种容器,用于存储固定大小的同类型元素序列。在Java中,数组是用连续的内存空间来存储相同类型的数据。 二、数组的定义 Java中使用[]来声明一个数组类型,且数组必须被初始化为一定数量的元素。数组的长度是不可变的。 dataType[] arrayName; // 声明数组 arrayName…

    Java 2023年5月26日
    00
  • 详细聊聊SpringBoot中动态切换数据源的方法

    下面是详细聊聊SpringBoot中动态切换数据源的方法的完整攻略,主要分为以下几个部分: 1. 前置条件 在使用SpringBoot动态切换数据源之前,我们需要准备以下环境和工具: SpringBoot框架(推荐使用最新版) 数据源配置文件(指定一个或多个数据库配置,其中至少要包含一个默认数据源配置) 动态数据源切换工具类(可自己实现或者选择第三方库) 接…

    Java 2023年5月20日
    00
  • 安全脚本程序的编写 V1.0

    以下是“安全脚本程序的编写 V1.0”的完整攻略: 1. 概述 安全脚本是一种用来实现网络安全自动化、快速响应的编程语言。它通常被用来监控网络中的异常行为、进行安全评估与渗透测试、审计日志等。Python、Ruby、Perl和Shell等编程语言都可以用来编写安全脚本的程序。 编写安全脚本程序需要注意以下几点: 确定脚本的目的和范围 在编写脚本前进行需求分析…

    Java 2023年6月15日
    00
  • Java Servlet输出中文乱码问题解决方案

    针对“Java Servlet输出中文乱码问题解决方案”,我来给你一个完整的攻略。具体步骤如下: 1. 设置请求和响应的编码方式 在Servlet中,我们需要设置请求和响应的编码方式为utf-8,即: request.setCharacterEncoding("utf-8"); // 设置请求编码方式为utf-8 response.set…

    Java 2023年5月20日
    00
  • Tomcat 多个应用配置方法

    以下是 Tomcat 多个应用配置方法的完整攻略: 步骤一:创建多个应用目录 在Tomcat安装目录下的webapps目录下新增多个目录,分别作为每个应用的根目录。例如,在webapps目录下创建两个目录newapp和oldapp,分别代表新版应用和旧版应用。 步骤二:配置Tomcat服务 在Tomcat安装目录下的conf目录下找到server.xml文件…

    Java 2023年5月19日
    00
  • Spring Security实现HTTP认证

    下面是关于“Spring Security实现HTTP认证”的完整攻略。 什么是Spring Security Spring Security是基于Spring框架的安全框架。它提供了一系列的安全服务,包括身份验证(Authentication)、授权(Authorization)等,用于保护Web应用或Web服务。 实现HTTP认证的步骤 下面是实现HTT…

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