持続性プロバイダーの eclipselink にも同様の問題がありました。一時的な「クライアント orderID」を持つクライアント データベースからサーバー データベース内の既存の顧客に新しい注文を追加する必要がありました。今後のクライアント要求には「サーバーの orderID」が必要だったので、マップ (clientID、serverID) を作成してクライアントに送り返したいと思いました。基本的に私のアプローチは、新しく追加された子注文のコピーへの参照を取得することです。親クラス customer のリストの最後に常に追加され、その事実を使用して取得されます。
Customer と Order というエンティティ クラスを使用します。ここで、Customer には注文のリスト (LinkedList) があります。
親顧客クラス: ...
@OneToMany(mappedBy = "customer", cascade=CascadeType.ALL, orphanRemoval = true)
private List<Order> orders = new LinkedList<Order>();
public Order getLastOrder() {
return orders.get(orders.size()-1);
}
子注文クラス:
@ManyToOne(optional=false)
private Customer customer;
サーブレット:
Customer customer = customerService.findByID(customerID); //existing customer
Order order = new Order();
//add attributes to new order
customer.addOrder(order);
customerService.update(customer); //generates keys for children
order = customer.getLastOrder();
Long orderID = order.getID; //Nullpointer exception
CustomerService は EntityManager.merge で顧客を更新しますが、サーブレットの参照を更新するのを忘れていました:
CustomerService クラス:
public void update(Customer entity) {
entityManager.merge(entity);
}
私はこのように解決しました: CustomerService クラス:
public Customer update(Customer entity) {
return entityManager.merge(entity);
}
サーブレット: ....
customer = customerService.update(customer); //generates keys for children
今、すべてが正常に動作します。