Ленивая инициализация сопоставления OnetoOne при повторном запуске обновления - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь понять, почему, когда я нажимаю на контроллер во второй раз, My OnetoOne Mapping инициализируется с помощью lay.Ниже приведен мой код: Контроллер:

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


public void setCustomer_address_id(int customer_address_id) {
    this.customer_address_id = customer_address_id;
}


public Customer() {

}

}

Структура Json для контроллера:

{
    "orderId" :101,
    "customerId" : 2
}

Таблица заказов для первого попадания:

enter image description here

Скриншот аннотированной сущности OnetoOne для первого попадания:

enter image description here

Таблица заказов для второго удара:

enter image description here

Когда я ударяюсь во второй раз, я получаю ленивый загруженный бин,Почему это происходит:

enter image description here

Одно важное замечание, если я прокомментирую ниже строку в контроллере:

Order s1 = orderRepository.findByOrderId(orderVO.getOrderId()); :

и заменим еес Order s1 = null, я больше не получаю ленивый инициализированный бин.Был ли спящий режим с использованием того же самого ленивого инициализированного bean-компонента внутри страны ??это с нулем:

@RequestMapping(value="/updateOrderbyOrderid", method=RequestMethod.PUT,produces=MediaType.APPLICATION_JSON_VALUE)
public Order updateOrderbyOrderid (@RequestBody Order orderVO ) {
System.out.println(orderVO.getOrderId());
Order s1 = null;
//Order s1 = orderRepository.findByOrderId(orderVO.getOrderId());
if (orderVO.getCustomerId()!=null) {
    orderVO.setCustomer(customerRepository.findByCustomerId(orderVO.getCustomerId()));
}

s1 = orderRepository.saveAndFlush(orderVO);

return s1;
}

1 Ответ

1 голос
/ 21 июля 2019

Это происходит из-за того, что Hibernate кэширует объект, и когда я нажимаю второй раз, он возвращает прокси-объект для кэшированного элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...