let's placeBid
이 예 는 매우 낡 았 다. 이전의 Domain Model 논쟁 에서 광범 위 하 게 인용 되 었 다. (참조:http://www.iteye.com/topic/11712)。볶음밥 다시 볶 을 게 요.
이 Domain 은 이렇게 간략화 할 수 있다.
public class Item {
private Set bids = new HashSet();
}
public class Bid {
private User bidder;
private int amount;
}
지금 우 리 는 placeBid 라 는 행동 을 추가 해 야 한다.그래서 우 리 는 다음 과 같은 빈혈 코드 를 쓸 수 있다.
Bid currentMaxBid = itemDAO.getMaxBid(itemId);
Item item = itemDAO.findById(itemId, true);
if (currentMaxBid != null && bidAmount <= currentMaxBid.getAmount()) {
throw new BizException("Bid too low.");
}
Bid newBid = new Bid(this, bidder, bidAmount);
item.getBids().add(bid);
itemDao.save(item);
이런 코드 에 무슨 문제 가 있 습 니까?나 는 더 많은 수요 가 없고 시스템 규모 가 크 지 않 은 상황 에서 이런 결함 을 증명 할 강력 한 증 거 를 제시 할 수 없다 고 생각한다.그러면 전형 적 인 Hibernate 방법 으로 분야 모델 을 만 드 는 방법 을 살 펴 보 겠 습 니 다. (robbin 의 두 번 째 모델 참조)
public class Item {
public Bid placeBid(User bidder, int bidAmount, Bid currentMaxBid) {
if (currentMaxBid != null && bidAmount <= currentMaxBid.getAmount()) {
throw new BizException("Bid too low.");
}
Bid newBid = new Bid(this, bidder, bidAmount);
bids.add(newBid);
return newBid;
}
}
그 오래된 게시 물 (나 는 알 고 있다, n 년 전) 에서 칠 채 늑대 가 문 제 를 제기 했다. 바로:
인용 하 다.
세 번 째 클래스 DomainLogic, 즉 복잡 한 조회 에 의존 해 야 하 는 Logic
그렇다면 이런 논리 가 필요 한 것 은 무엇 입 니까?먼 곳 은 하늘가 에 있 고, 가 까 운 곳 은 눈앞 에 있다.current MaxBid 어디서 났 어 요?다 오 에서 꺼 낸 거 잖 아.내 Item 은 자신의 bids 를 포함 하고 있 는데, 그것 은 뜻밖에도 max Bid 가 무엇 인지 알 방법 이 없고, 밖에서 매개 변수 로 들 어 와 야 한다.이것 은 불합리한 것 이지 만 부득이 한 것 이다.Hibernate 의 고전적 인 해결 방안 은 이러한 조회 논 리 를 Domain 사용자 의 편 에 놓 고 DAO 를 호출 해 야 한 다 는 것 을 제약한다.하면, 만약, 만약...http://www.iteye.com/topic/191261) 내 가 말 한 RichSet 는 쉽게 해결 할 수 있다.
public class Item {
private RichSet bids = new DefaultRichSet();
public Bid placeBid(User bidder, int bidAmount) {
Bid currentMaxBid = bids.max("amount");
if (currentMaxBid != null && bidAmount <= currentMaxBid.getAmount()) {
throw new BizException("Bid too low.");
}
Bid newBid = new Bid(this, bidder, bidAmount);
bids.add(newBid);
return newBid;
}
}
max 가 부족 한 상황 에서 의 실현 은 목록 을 옮 겨 다 니 는 것 입 니 다.Hibernate 가 강화 되면 서 SQL 조회 가 되 었 습 니 다.bids. add 와 같은 결 성 된 상황 은 목록 작업 이 고, Hibernate 가 저장 할 때 SQL 의 INSERT 가 됩 니 다.
제 관점 은 이른바 대량 조작 이 Domain Logic 에 속 하지 않 는 것 은 Hibernate 로 인 한 제한 이라는 것 입 니 다.실제 도 메 인 에는 리 포 지 토리 라 는 대상 이 있어 야 한다.그것 은 List 를 봉 했다.
public class ItemRepository {
private RichList- items
public ItemRepository(RichList
- items) {
this.items = items;
}
}
분야 의 대상 이 되 는 아 이 템 Repository 는 아 이 템 이 어디서 왔 는 지 에 관심 이 없다.이 items 는 domain 의 모든 item 이 라 고 생각 합 니 다.따라서 addItem 의 item 은 이름 이 중복 되 지 않 는 검사 없 이 자 연 스 럽 게 Item Repository 에 놓 을 수 있 습 니 다.
public class ItemRepository {
public void addItem(String name) {
if (items.find("name").eq(name).size() > 0) {
throw new BizException("name duplicated");
}
Item item = new Item(name);
items.add(item);
return item;
}
}
도 메 인 에 서 는 모든 아 이 템 목록 이 아 이 템 Repository 로 포장 되 어야 합 니 다.아 이 템 의 이름 유일 성 을 보장 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[JPA] 즉시로딩(EAGER)과 지연로딩(LAZY) (왜 LAZY 로딩을 써야할까?) (1)Proxy는 이 글의 주제인 즉시로딩과 지연로딩을 구현하는데 중요한 개념인데, 일단 원리는 미뤄두고 즉시로딩과 지연로딩이 무엇인지에 대해 먼저 알아보자. 눈 여겨 볼 곳은 'fetch = FetchType.EAGER...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.