亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

第二次觸發更新時延遲初始化 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()將使托管實體 --> 非托管,并將其從緩存中刪除?,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;

}


查看完整回答
反對 回復 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 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號