📅  最后修改于: 2023-12-03 15:15:31.751000             🧑  作者: Mango
在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代码中,我们需要定义两个实体类: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中,如何映射一个列表,并通过示例程序演示了相关操作的实现。希望本教程对大家了解集合映射的相关内容有所帮助。