📜  Hibernate教程:集合映射中的映射列表(1)

📅  最后修改于: 2023-12-03 15:15:31.751000             🧑  作者: Mango

Hibernate教程:集合映射中的映射列表

在Hibernate中,我们经常需要将Java集合与数据库表之间进行映射。集合映射是Hibernate中常用的一种映射方式之一,它比单一实体类映射更加灵活,可以处理多个相关实体的关联关系。

本篇教程将介绍在集合映射中,如何映射列表。

映射列表

在Hibernate中,我们可以将Java中的List、Set等集合类型映射为数据库中的表。当一个列表被映射到数据库表中时,它会被分解为多个行,每行存储列表中的一个元素。这样,我们就可以将一个关联关系中的多个实体存储到一个列表中,从而实现一对多的映射。

下面,我们将以一个订单(Order)和多个商品(Item)之间的关系为例,来演示如何映射一个列表。

数据库设计

在本例中,我们将使用以下两张表来存储订单和商品的信息:

CREATE TABLE `orders` (
  `order_id` int(11) NOT NULL AUTO_INCREMENT,
  `order_number` varchar(45) NOT NULL,
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `items` (
  `item_id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `item_name` varchar(45) NOT NULL,
  `item_quantity` int(11) NOT NULL,
  PRIMARY KEY (`item_id`),
  FOREIGN KEY (`order_id`) REFERENCES `orders`(`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

其中,orders表存储订单的基本信息,包括订单号和订单ID;items表存储订单中的商品信息,包括商品名称、数量和订单ID(作为外键,与orders表建立关联)。

Java实体类设计

在Java代码中,我们需要定义两个实体类:Order和Item。其中,Order类有一个List类型的属性items,用于存储该订单中的商品。Item类则包括商品的基本信息:名称和数量。

@Entity
@Table(name = "orders")
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "order_id")
    private int id;

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

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

    // Getters and setters
}

@Entity
@Table(name = "items")
public class Item {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "item_id")
    private int id;

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

    @Column(name = "item_quantity")
    private int quantity;

    @ManyToOne
    @JoinColumn(name = "order_id")
    private Order order;

    // Getters and setters
}

在Order类中,我们使用@OneToMany注解标注items属性,将其与Item类建立一对多的关系。mappedBy属性表示,该关系的维护在Item类中,即Item类中的order属性(ManyToOne注解标注)与Order类中的items属性建立了一种从属关系。cascade属性表示,级联操作。当Order对象被删除时,它所关联的Item对象也将被删除。

在Item类中,我们使用@ManyToOne注解标注order属性,将其与Order类建立多对一的关系。JoinColumn注解表示,该属性与外键(order_id)建立了关联。

测试程序

下面,我们将编写一个测试程序,演示如何向数据库中插入数据并查询结果。

public class AppTest {

    private static SessionFactory sessionFactory;

    public static void main(String[] args) {

        sessionFactory = new AnnotationConfiguration()
                .configure("hibernate.cfg.xml")
                .addAnnotatedClass(Order.class)
                .addAnnotatedClass(Item.class)
                .buildSessionFactory();

        Session session = sessionFactory.getCurrentSession();

        Transaction tx = null;

        try {
            tx = session.beginTransaction();

            Order order = new Order();
            order.setOrderNumber("20210901");

            Item item1 = new Item();
            item1.setName("Computer");
            item1.setQuantity(5);

            Item item2 = new Item();
            item2.setName("Monitor");
            item2.setQuantity(2);

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

            session.save(order);

            tx.commit();

            session = sessionFactory.getCurrentSession();
            tx = session.beginTransaction();

            List<Order> orders = session.createQuery("FROM Order").list();

            for (Order o : orders) {
                System.out.println("Order Number: " + o.getOrderNumber());
                for (Item i : o.getItems()) {
                    System.out.println("Item Name: " + i.getName() + ", Quantity: " + i.getQuantity());
                }
            }

            tx.commit();

        } catch (HibernateException e) {
            if (tx != null) tx.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }

        sessionFactory.close();
    }
}

在测试程序中,我们先创建了一个Order对象,并向其items属性中添加两个Item对象。然后,将Order对象保存到数据库中,执行查询操作,并输出结果。

运行结果

执行测试程序后,可以得到以下输出结果:

Order Number: 20210901
Item Name: Computer, Quantity: 5
Item Name: Monitor, Quantity: 2

可以看到,我们成功地将一个订单和多个商品之间的关系映射到了数据库中,并从数据库中正确地查询到了数据。

在本教程中,我们介绍了在Hibernate中,如何映射一个列表,并通过示例程序演示了相关操作的实现。希望本教程对大家了解集合映射的相关内容有所帮助。