springboot jpa 两个数据表,一对多,联表插入、查询 ,我需要更加详细的代码
时间: 2024-02-28 21:53:21 浏览: 107
将postgres 表结构和数据转换到sqllite数据库中的工具类源码
好的,以下是一个简单的示例:
假设有两个实体类:`Order`和`Product`,一个订单可以包含多个商品,因此它们之间是一对多的关系。
Order.java
```java
@Entity
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "order_name")
private String name;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<Product> products;
// getters and setters
}
```
Product.java
```java
@Entity
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "product_name")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "order_id")
private Order order;
// getters and setters
}
```
在`Order`实体类中,我们使用`@OneToMany`注解来表示它与`Product`实体类是一对多的关系,`mappedBy`参数指定了另一端的属性名为`order`,`cascade`参数指定了级联操作,也就是当我们对`Order`实体类进行操作时,也会对关联的`Product`实体类进行相应的操作,例如删除订单时也会删除关联的商品。
在`Product`实体类中,我们使用`@ManyToOne`注解来表示它与`Order`实体类是多对一的关系,`fetch`参数指定了懒加载,也就是在需要使用时才会从数据库中加载关联的订单信息,避免了不必要的数据查询,`@JoinColumn`注解指定了外键为`order_id`。
下面是一个简单的插入数据的示例:
```java
@Autowired
private OrderRepository orderRepository;
@Transactional
public void insertData() {
Order order = new Order();
order.setName("Order 1");
List<Product> products = new ArrayList<>();
Product product1 = new Product();
product1.setName("Product 1");
product1.setOrder(order);
products.add(product1);
Product product2 = new Product();
product2.setName("Product 2");
product2.setOrder(order);
products.add(product2);
order.setProducts(products);
orderRepository.save(order);
}
```
在这个示例中,我们创建了一个`Order`对象和两个`Product`对象,并且将它们关联起来,然后将`Order`对象保存到数据库中。
接下来是一个查询数据的示例:
```java
@Autowired
private OrderRepository orderRepository;
public Order findOrderById(Long id) {
return orderRepository.findById(id).orElse(null);
}
```
在这个示例中,我们通过`OrderRepository`的`findById`方法来查询指定id的订单信息,由于这个方法返回的是一个`Optional`对象,因此我们使用`orElse`方法来避免空指针异常。
以上就是一个简单的示例,你可以根据自己的需求进行相应的修改。
阅读全文