Как сказал
У нас есть отдельный уровень для бизнес-логики (обычно называемый сервисным уровнем)
Domain-Driven-Design (DDD) утверждает, что вы должны поместить бизнес-логику в модель вашего домена. И, поверьте мне, это действительно хорошо. Как сказал POJO в книге действий об уровне обслуживания
- Это вариант использования
- Может определять границы транзакций
До
@Service
public class BidServiceImpl implements BidService {
@Autowired
private ItemRepository itemRepository;
public void placeBid(Integer itemId, User bidder, BigDecimal amount) {
Item item = itemRepository.getById(itemId);
if(amount.compareTo(new BigDecimal("0.00")) <= 0)
throw new IllegalStateException("Amount must be greater than zero");
if(!bidder.isEnabled())
throw new IllegalStateException("Disabled bidder");
item.getBidList().add(new Bid(bidder, amount));
}
}
* После 1021 *
@Service
public class BidServiceImpl implements BidService {
@Autowired
private ItemRepository itemRepository;
public void placeBid(Integer itemId, User bidder, BigDecimal amount) {
// itemRepository will retrieve a managed Item instance
Item item = itemRepository.getById(itemId);
item.placeBid(bidder, amount);
}
}
Ваша логика домена выглядит следующим образом
@Entity
public class Item implements Serializable {
private List<Bid> bidList = new ArrayList<Bid>();
@OneToMany(cascade=CascadeType.ALL)
public List<Bid> getBidList() {
return this.bidList;
}
public void placeBid(User bidder, BigDecimal amount) {
if(amount.compareTo(new BigDecimal("0.00")) <= 0)
throw new IllegalStateException("Amount must be greater than zero");
if(!bidder.isEnabled())
throw new IllegalStateException("Disabled bidder");
/**
* By using Automatic Dirty Checking
*
* Hibernate will save our Bid
*/
item.getBidList().add(new Bid(bidder, amount));
}
}
При использовании Domain-Driven-Design ваша бизнес-логика живет в нужном месте. Но, иногда , это может быть хорошей идеей для определения вашей бизнес-логики внутри уровня обслуживания. Смотри здесь почему