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);
Другие вопросы по тегам