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日

相关文章

  • SpringMVC请求参数的使用总结

    SpringMVC请求参数的使用总结 在 SpringMVC 中,我们经常需要获取请求参数,包括 GET 请求和 POST 请求。本文将详细讲解 SpringMVC 请求参数的使用,包括如何获取 GET 请求参数、POST 请求参数、路径参数和请求头参数,并提供两个示例说明。 获取 GET 请求参数 在 SpringMVC 中,我们可以使用 @Request…

    Java 2023年5月18日
    00
  • SpringMVC自定义拦截器实现过程详解

    下面是SpringMVC自定义拦截器实现的详细攻略。 什么是拦截器? 拦截器(Interceptor)是SpringMVC框架提供的用于处理请求的一种机制。拦截器在处理请求的过程中,可以在Controller之前或之后执行一些共同的操作,如记录日志、检查用户权限、对请求参数进行统一预处理等等。拦截器类似于Servlet的过滤器(Filter),不同的是拦截器…

    Java 2023年5月16日
    00
  • @Autowired自动装配,@Bean注入@Primary,@Qualifier优先级讲解

    下面是对@Autowired、@Bean和@Qualifier的详细讲解: @Autowired自动装配 概念 @Autowired 注解是用于自动将某个类型的 bean 注入到另一个 bean 中的注解。在 Spring 容器中,如果一个接口只被一个具体实现类所实现,那么 Spring 在注入时会自动识别该实现类,并将其注入到另一个 bean 中。 示例 …

    Java 2023年5月31日
    00
  • Java基础巩固系列包装类代码实例

    Java基础巩固系列包装类代码实例攻略 什么是包装类 在Java中,每一种数据类型都有对应的包装类,包装类的主要作用是为了解决基本数据类型不能直接参与面向对象的操作的问题,同时也为了增加一些方法帮助我们更好地处理数据。Java中包装类都位于java.lang包中,我们可以通过包装类来将基本数据类型转换成对象,进而操作这些对象。 何时需要使用包装类 当我们需要…

    Java 2023年5月23日
    00
  • Java11 发布前抓紧掌握这些新特性

    Java 11 发布前抓紧掌握这些新特性 Java 11 是一个重要的版本,其中包含了许多有用的新特性。本文将介绍一些最重要的新特性,并向您展示如何使用它们。 1. 局部变量类型推断 Java 10 引入了局部变量类型推断,Java 11 对其进行了改进。现在,您可以使用 var 关键字来声明局部变量,让编译器自动推断出变量类型。例如: var x = &q…

    Java 2023年5月24日
    00
  • Java反射机制的学习总结

    Java反射机制的学习总结 什么是Java反射机制? Java反射机制是指在程序运行时动态获取类的信息以及动态调用对象的方法的机制。 我们在开发中常常需要在运行时动态地加载和使用类,例如在插件系统中使用的动态加载和使用各种插件类的方式,这就需要用到Java反射机制。 通过利用Java反射机制,程序可以在不知道具体类名的情况下,获取类的相关信息,创建对象实例,…

    Java 2023年6月1日
    00
  • Java压缩文件夹最实用简单的方法

    下面我将为您讲解Java压缩文件夹最实用简单的方法的完整攻略。 什么是Java压缩文件夹? Java中的压缩文件夹指的是将多个文件和文件夹压缩成一个文件,以减小文件的大小,并且方便传输和存储。Java中提供了许多压缩文件夹的处理工具类,其中最常用的是java.util.zip.ZipOutputStream类和java.util.zip.ZipInputSt…

    Java 2023年5月20日
    00
  • Java编程实现验证哥德巴赫猜想

    关于“Java编程实现验证哥德巴赫猜想”的完整攻略,我将从以下几个方面进行讲解: 哥德巴赫猜想简介; 算法思路; 代码实现; 示例说明。 1. 哥德巴赫猜想简介 哥德巴赫猜想,又叫作高斯-哥德巴赫猜想,是数学中一个著名的未解决问题,内容是:任何一个大于2的偶数,都可以表示成两个素数(质数)之和的形式。例如,8可以表示为3+5,20可以表示为3+17、7+13…

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