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()将使托管实体 --> 非托管,并将其从缓存中删除。现在,当我执行代码时,我得到了新初始化的 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;
希望它会有所帮助。
添加回答
举报
