エンティティーを変更する場合は、インスタンスを検出し、インスタンスと参照先エンティティーを更新し、トランザクションをコミットできます。
public static void updateCustomerOrder(EntityManager em) {
em.getTransaction().begin();
Order order = (Order) em.find(Order.class, "ORDER_1");
processDiscount(order, 10);
Customer cust = order.customer;
cust.phoneNumber = "5075551234";
em.getTransaction().commit();
}
public static void processDiscount(Order order, double discountPct) {
for(OrderLine line : order.lines) {
line.price = line.price * ((100-discountPct)/100);
}
}
トランザクションをフラッシュすると、すべての管理エンティティーがキャッシュと同期化されます。
トランザクションがコミットされると、フラッシュが自動的に実行されます。
この場合は、Order が管理エンティティーとなります。
Order、Customer、および OrderLine から参照されるエンティティーも管理エンティティーとなります。
トランザクションがフラッシュされるとき、
各エンティティーは検査され、変更されているかどうかが判定されます。変更されているエンティティーは、
キャッシュ内で更新されます。コミットまたはロールバックされてトランザクションが完了した後、
エンティティーは切り離され、エンティティーで行われた変更はキャッシュに反映されません。