3 回答

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個(gè)贊
Spring Data JPAfindBy()
方法由EntityManager.find()
. EntityManager.find()
首先檢查緩存中的數(shù)據(jù),如果在緩存中沒有找到數(shù)據(jù),則點(diǎn)擊數(shù)據(jù)庫加載數(shù)據(jù)并放入緩存以使其管理。
如果我們再次這樣做EntityManager.find()
(再次針對(duì)相同的主鍵),它會(huì)再次檢查緩存。現(xiàn)在這一次數(shù)據(jù)是從緩存中加載而不是命中數(shù)據(jù)庫。
我認(rèn)為 Hibernate 正在緩存對(duì)象,當(dāng)我第二次點(diǎn)擊它時(shí),它會(huì)返回緩存項(xiàng)的代理對(duì)象。
以下是我已閱讀以了解findBy()
工作的鏈接。
使用 getOne 和 findOne 方法時(shí) Spring Data JPA
類似的負(fù)載并在彈簧數(shù)據(jù)上獲取休眠方法
EntityManager.find() 和 EntityManger.getReference() 有什么區(qū)別?
現(xiàn)在為了測試我是否正確,我em.detach()
在下面的代碼中使用了。detach()
將使托管實(shí)體 --> 非托管,并將其從緩存中刪除。現(xiàn)在,當(dāng)我執(zhí)行代碼時(shí),我得到了新初始化的 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貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
您的映射看起來很像多對(duì)多。試試這個(gè):
// 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貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
我認(rèn)為您必須使用fetch=FetchType.EAGER進(jìn)行 OneToOne 映射
@OneToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinColumn(name = "ORDER_CUSTOMER_ID", referencedColumnName = "CUSTOMER_ID")
private Customer customer;
希望它會(huì)有所幫助。
添加回答
舉報(bào)