3 回答

TA貢獻1111條經驗 獲得超0個贊
Spring Data JPAfindBy()
方法由EntityManager.find()
. EntityManager.find()
首先檢查緩存中的數據,如果在緩存中沒有找到數據,則點擊數據庫加載數據并放入緩存以使其管理。
如果我們再次這樣做EntityManager.find()
(再次針對相同的主鍵),它會再次檢查緩存。現在這一次數據是從緩存中加載而不是命中數據庫。
我認為 Hibernate 正在緩存對象,當我第二次點擊它時,它會返回緩存項的代理對象。
以下是我已閱讀以了解findBy()
工作的鏈接。
使用 getOne 和 findOne 方法時 Spring Data JPA
EntityManager.find() 和 EntityManger.getReference() 有什么區別?
現在為了測試我是否正確,我em.detach()
在下面的代碼中使用了。detach()
將使托管實體 --> 非托管,并將其從緩存中刪除?,F在,當我執行代碼時,我得到了新初始化的 bean。
@RequestMapping(value="/updateOrderbyOrderid", method=RequestMethod.PUT,produces=MediaType.APPLICATION_JSON_VALUE)
public Order updateOrderbyOrderid (@Valid @RequestBody Order orderVO ) {
System.out.println(orderVO.getOrderId());
Order s1 = orderRepository.findByOrderId(orderVO.getOrderId());
em.detach(s1.getCustomer());
s1= null;
if (orderVO.getCustomerId()!=null) {
Customer findByCustomerId = customerRepository.findByCustomerId(orderVO.getCustomerId());
orderVO.setCustomer(customerRepository.findByCustomerId(orderVO.getCustomerId()));
}
s1 = orderRepository.saveAndFlush(orderVO);
return s1;
}

TA貢獻1856條經驗 獲得超17個贊
您的映射看起來很像多對多。試試這個:
// OrderTable
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "CUSTOMER_ID", nullable = false)
private Customer customer;
// constructors
public OrderTable() {}
public OrderTable(Customer customer) { this.customer = customer; }
// Customer
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "customer")
private OrderTable orderTable;

TA貢獻1877條經驗 獲得超6個贊
我認為您必須使用fetch=FetchType.EAGER進行 OneToOne 映射
@OneToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinColumn(name = "ORDER_CUSTOMER_ID", referencedColumnName = "CUSTOMER_ID")
private Customer customer;
希望它會有所幫助。
添加回答
舉報