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

我试图理解为什么当我第二次点击控制器时,我的 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;

}



侃侃无极
浏览 205回答 3
3回答

catspeake

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;}

慕慕森

您的映射看起来很像多对多。试试这个:// OrderTable@OneToOne(fetch = FetchType.LAZY, optional = false)@JoinColumn(name = "CUSTOMER_ID", nullable = false)private Customer customer;// constructorspublic OrderTable() {}public OrderTable(Customer customer) { this.customer = customer; }// Customer@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "customer")private OrderTable orderTable;

慕哥9229398

我认为您必须使用fetch=FetchType.EAGER进行 OneToOne 映射@OneToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)@JoinColumn(name = "ORDER_CUSTOMER_ID", referencedColumnName = "CUSTOMER_ID")private Customer customer;希望它会有所帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java