繁体   English   中英

使用 spring 数据从关系数据库添加和检索数据 jpa

[英]Adding and retrieving the data from relational database using spring data jpa

我用的是spring数据jpa

我有两张桌子 person, order

两者都具有一对多的关系,从人到订单 order(person_id) -> person(id)

create table person (id int primary key, name varchar(20));
create table order (id int primary key, name varchar(20), person_id foreign key references person(id));

考虑一下我已经为两个表设置了模式,但还没有数据。 我需要插入这些数据 -

Person  {name: "person1"}
Order {name: "order1", person_id: <corresponding to person1 record>}

插入外键关联的数据需要调用两次db吗?

  1. 救人
  2. 从保存的人实体(步骤 1)中获取主键,然后保存订单?
    Person person = new Person("person1");
    Person person = personRepository.save(person);
    
    Order order = new Order("order1");
    order.setPersonId(person.getId());
    orderRepository.save(order);

或者是否有任何替代方法可以使用一次调用 db 将数据保存到两个表中?

检索数据如果我需要检索人员和订单,spring 数据 jpa 会在单个数据库调用中给出结果还是需要分别从两个表中提取数据?

Person person = personRepository.findByName("person1").get();   \\for eg: consider name is unique here
List<Order> orders = orderRepository.findByPersonId(person.getId());

或单个数据库调用中的任何替代方法?

非常感谢能够明确这些问题。

提前感谢您的回答。

看看级联类型 通过添加级联类型,您只需调用一次存储库即可保存两个对象。

@Entity
public class Order {
    // other fields...
    @OneToMany(mappedBy = "person", cascade = CascadeType.ALL)
    private List<Order> orders;
}

@Entity
public class Person {
    // other fields...
    @ManyToOne
    private Person person;
}

Order order = new Order();
Person person = new Person();
person.setOrders(List.of(order));
order.setPerson(person);
personRepository.save(person); // <--- since save action on person cascades, it will also save the order.

确保对象在保存之前相互链接(上面示例中存储库调用上方的 2 行)

关于获取数据如果您调用 personRepository 并且它有链接到它的订单,您可以通过配置eager fetch (不推荐)或通过将您的方法包装在 Transactional 注释中并以编程方式访问订单来访问它们。

@Transactional
public void doSomething() {
    Person person = personRepository.findById(1);
    List<Order> orders = person.getOrders();
}

请注意,从数据库的角度来看,在保存和获取数据的两种情况下,将执行与使用单独的存储库调用时相同数量的查询,但是您减少了这样做所需的代码并且在事务中更容易工作并且只关注 java object 而不是必须调用多个存储库,尤其是当您的数据库数据 model 增长时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM