为了账号安全,请及时绑定邮箱和手机立即绑定

第二次触发更新时延迟初始化 OnetoOne 映射

第二次触发更新时延迟初始化 OnetoOne 映射

侃侃无极 2022-10-20 17:26:27
我试图理解为什么当我第二次点击控制器时,我的 OnetoOne 映射正在初始化。下面是我的代码:控制器:@RequestMapping(value="/updateOrderbyOrderid", method=RequestMethod.PUT,produces=MediaType.APPLICATION_JSON_VALUE)public Order updateOrderbyOrderid (@RequestBody Order orderVO ) {System.out.println(orderVO.getOrderId());Order s1 = orderRepository.findByOrderId(orderVO.getOrderId());if (orderVO.getCustomerId()!=null) {    orderVO.setCustomer(customerRepository.findByCustomerId(orderVO.getCustomerId()));}s1 = orderRepository.saveAndFlush(orderVO);return s1;}订单实体:@Entity@Table(name="Ordertable", schema="cf_2583f365_c3c6_499a_a60d_138e7e7023eb")public class Order {@Id@Column(name = "ORDER_ID")@GeneratedValue(strategy=GenerationType.IDENTITY)private int orderId;@OneToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)@JoinColumn(name = "ORDER_CUSTOMER_ID", referencedColumnName = "CUSTOMER_ID")private Customer customer;private transient Long customerId;public int getOrderId() {    return orderId;}public void setOrderId(int orderId) {    this.orderId = orderId;}public Customer getCustomer() {    return customer;}public void setCustomer(Customer customer) {    this.customer = customer;}public Long getCustomerId() {    return customerId;}public void setCustomerId(Long customerId) {    this.customerId = customerId;}}客户实体:@Entity@Table(name="Customer", schema="cf_2583f365_c3c6_499a_a60d_138e7e7023eb")public class Customer {@Id@Column(name = "CUSTOMER_ID")@GeneratedValue(strategy=GenerationType.IDENTITY)private Long customerId;@Column(name = "CUSTOMER_NAME")private String customer_name;@Column(name = "CUSTOMER_address_id")private int customer_address_id;public Long getCustomerId() {    return customerId;}public void setCustomerId(Long customerId) {    this.customerId = customerId;}public String getCustomer_name() {    return customer_name;}public void setCustomer_name(String customer_name) {    this.customer_name = customer_name;}public int getCustomer_address_id() {    return customer_address_id;}
查看完整描述

3 回答

?
catspeake

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;

}


查看完整回答
反对 回复 2022-10-20
?
慕慕森

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;


查看完整回答
反对 回复 2022-10-20
?
慕哥9229398

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;

希望它会有所帮助。


查看完整回答
反对 回复 2022-10-20
  • 3 回答
  • 0 关注
  • 204 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号