[spring]Web階層開発-3

5908 ワード

連結変更の検出


JPAでは,感知と統合の違いを変更することが重要である.
準永続性エンティティ=JPA永続性コンテキストとは、管理されなくなったエンティティのことです.
以前に商品を変更したときと同様に、dbに入ると識別子がdbに存在し、準永続オブジェクトと呼ばれる.
JPA識別可能IDを有する

Bookオブジェクトは既にDBに1回格納されており、識別子が存在する.このように任意に作成されたエンティティにも既存の識別子がある場合、これを準ゼロ速エンティティと見なすことができる.
準俗俗はJPAが管理しないnewとして作成
準零速エンティティデータを変更する方法、準零速エンティティを変更する方法
1.変更検出機能の使用
汚れ検査
値をパラメータに設定すると、@Transactionalはコミットとともにリフレッシュされます.
永続的なコンテキストでの変更の検索と変更に対してupdateクエリーを発行
@Transactional
void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를 조회한
다.
findItem.setPrice(itemParam.getPrice()); //데이터를 수정한다.
}
2.連結の使用
(Merge)
マージは、準永続状態にあるエンティティを永続状態に変更する場合に使用します.
@Transactional
void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
Item mergeItem = em.merge(item);
}
マージ操作
1.merge()を実行します.
2.パラメータに渡された準零速エンティティの識別子値を使用して、プライマリキャッシュでエンティティを問合せます.
2-1. プライマリ・キャッシュにエンティティがない場合は、データベースからエンティティを問合せ、プライマリ・キャッシュに格納します.
3.クエリーされた永続エンティティにメンバーエンティティの値を入力します.(メンバーエンティティのすべての値
mergeMemberにプッシュされます.このとき、mergeMemberの「会員1」名は「会員名の変更」に変更されます.)
4.永久状態のmergeMemberを返します.
マージに注意
変更する属性のみを選択できますが、マージするとすべての属性が変更されます.(すべてのフィールドを置き換えます.設定されていない場合、dbはnullになります.)
mergeはきれいにできないので、なるべく書かないようにしましょう.

実際の作業では、エンティティを変更する場合は、常に変更検出として使用します。


コントローラに不自然なエンティティXを作成する
識別子(id)と変更するデータを、トランザクションを持つサービス層に明確に渡します.(パラメータまたはdto)
トランザクションのあるサービス・レベルで永続的なステータスのエンティティを表示し、エンティティのデータを直接変更します.
トランザクションのコミットポイントで変更検出を実行します.

注文する


Order Controlクラスの作成
package jpabook.jpashop.controller;

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.domain.item.Item;
import jpabook.jpashop.service.ItemService;
import jpabook.jpashop.service.MemberService;
import jpabook.jpashop.service.OrderService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;

import java.util.List;

@Controller
@RequiredArgsConstructor
public class OrderController {
    private final OrderService orderService;
    private final MemberService memberService;
    private final ItemService itemService;

    @GetMapping("/order")
    public String createForm(Model model){
        List<Member> members = memberService.findMembers();
        List<Item> items = itemService.findItems();

        model.addAttribute("members", members);
        model.addAttribute("items", items);
        return "order/orderForm";
    }
}
商品注文フォームorder/orderFormを作成した後

きれい
<option th:each="member : ${members}"
                th:value="${member.id}"
                th:text="${member.name}" />
それぞれにメンバーリストがあります.
PostMappingもご用意しております
@requestParamはformsubmitであり、valueが渡されると一致して変数にバインドされます.
@PostMapping("/order")
    public String order(@RequestParam("memberId") Long memberId,
                        @RequestParam("itemId") Long itemId,
                        @RequestParam("count") int count) {
        orderService.order(memberId, itemId, count);
        return "redirect:/orders";
    }

受注リストの取得、キャンセル

@GetMapping("/orders")
    public String orderList(@ModelAttribute("orderSearch") OrderSearch orderSearch, Model model) {
        List<Order> orders = orderService.findOrders(orderSearch);
        model.addAttribute("orders", orders);
        return "order/orderList";
    }
}

検索がいいです.
キャンセルオーダーコード
 @PostMapping(value = "/orders/{orderId}/cancel")
    public String cancelOrder(@PathVariable("orderId") Long orderId) {
        orderService.cancelOrder(orderId);
        return "redirect:/orders";
    }
キャンセルもスムーズでした.
やっと閉まりました~~今JPA 2の講義に行きましょう
今まで使っていたコード.
https://github.com/Vector1331/jpashop
githubで確認できます.