[英]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嗎?
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.