EclipseLink - двунаправленное отношение OneToMany
Допустим, у меня есть две сущности:
@Entity
public class Customer implements Serializable {
...
@OneToMany(cascade=ALL, mappedBy="customer")
public Set<Order> getOrders() {
return orders;
}
...
}
@Entity
public class Order implements Serializable {
...
@ManyToOne
@JoinColumn(name="CUST_ID", nullable=false)
public Customer getCustomer() {
return customer;
}
...
}
Затем я сохраняю сущность Customer, а после этого сущность Order со ссылкой на ранее добавленного Customer. Когда я извлекаю этого клиента из базы данных и вызываю getOrders, он возвращает пустой набор. Это нормальное поведение? Если да, что я могу сделать, чтобы автоматически обновить этот набор при добавлении нового объекта Order?
2 ответа
Jpa не поддерживает отношения для вас, приложение должно установить обе стороны двунаправленных отношений, чтобы синхронизировать их с базой данных. Добавляйте заказ в список заказов, когда вы устанавливаете отношение "заказ -> клиент" и, если клиент отсоединен, объедините его, чтобы получить изменения в коллекции.
В противном случае вам потребуется явное обновление, используя em.refresh или запрос с подсказкой запроса на обновление после транзакции, или исключить клиента из кэшей. В любом случае это требует попадания в базу данных, которого легко избежать, просто поддерживая обе стороны отношений.
Если вы извлекаете клиента из той же транзакции, то да, это ожидаемое поведение. Причина в том, что EntityManager возвращает заказ, который он имеет в своем кэше первого уровня, и что вы создали его самостоятельно, без добавления какого-либо заказа к его набору заказов. Вы несете ответственность за поддержание согласованности графа объектов, поддерживая две стороны ассоциации:
order.setCustomer(customer);
customer.addOrder(order);