德芙黑巧克力45.8元一斤,是不是算便宜的?
http://www.gusuwang.com/thread-2272597-1-1.html
package com.example.cachedemo;
import com.example.cachedemo.service.CoffeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* >>>为不同的缓存提供一层抽象
* 为Java方法增加缓存,缓存执行结果
* 支持ConcurrentMap,EhCache,Caffeine,JCache(JSR-107)
* 接口
* -- org.springframework.cache.Cache
* -- org.springframework.cache.CacheManager
*/
@Slf4j
@EnableTransactionManagement
@SpringBootApplication
@EnableJpaRepositories
@EnableCaching(proxyTargetClass = true)
public class CacheDemoApplication implements ApplicationRunner {
@Autowired
private CoffeeService coffeeService;
public static void main(String[] args) {
SpringApplication.run(CacheDemoApplication.class, args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("Count: {}", coffeeService.findAllCoffee().size());
for(int i=0;i<10;i++){
log.info("Reading from cache.");
coffeeService.findAllCoffee();
}
coffeeService.reloadCoffee();
log.info("Reading after refresh.");
coffeeService.findAllCoffee().forEach(c->log.info("Coffee {}",c.getName()));
}
}
package com.example.cachedemo.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import java.io.Serializable;
import java.util.Date;
@MappedSuperclass
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(updatable = false)
@CreationTimestamp
private Date createTime;
@UpdateTimestamp
private Date updateTime;
}
package com.example.cachedemo.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.hibernate.annotations.Type;
import org.joda.money.Money;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
@Entity
@Table(name = "T_COFFEE")
@Builder
@Data
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public class Coffee extends BaseEntity implements Serializable {
private String name;
@Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyMinorAmount",
parameters = {@org.hibernate.annotations.Parameter(name = "currencyCode", value = "CNY")})
private Money price;
}
//指定的Money为钱币记录扩展包
<dependency>
<groupId>org.joda</groupId>
<artifactId>joda-money</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>org.jadira.usertype</groupId>
<artifactId>usertype.core</artifactId>
<version>6.0.1.GA</version>
</dependency>
package com.example.cachedemo.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.List;
@Entity
@Table(name = "T_ORDER")
@Data
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CoffeeOrder extends BaseEntity implements Serializable {
private String customer;
@ManyToMany
@JoinTable(name = "T_ORDER_COFFEE")
@OrderBy("id")
private List<Coffee> items;
@Enumerated
@Column(nullable = false)
private OrderState state;
}
package com.example.cachedemo.model;
public enum OrderState {
INIT, PAID, BREWING, BREWED, TAKEN, CANCELLED
}
package com.example.cachedemo.repository;
import com.example.cachedemo.model.CoffeeOrder;
import org.springframework.data.jpa.repository.JpaRepository;
public interface CoffeeOrderRepository extends JpaRepository<CoffeeOrder,Long> {
}
package com.example.cachedemo.repository;
import com.example.cachedemo.model.Coffee;
import org.springframework.data.jpa.repository.JpaRepository;
public interface CoffeeRepository extends JpaRepository<Coffee,Long> {
}
package com.example.cachedemo.service;
import com.example.cachedemo.model.Coffee;
import com.example.cachedemo.repository.CoffeeRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
import static org.springframework.data.domain.ExampleMatcher.GenericPropertyMatchers.exact;
@Slf4j
@Service
@CacheConfig(cacheNames = "coffee")
public class CoffeeService {
@Autowired
private CoffeeRepository coffeeRepository;
@Cacheable
public List<Coffee> findAllCoffee(){
return coffeeRepository.findAll();
}
@CacheEvict
public void reloadCoffee(){}
public Optional<Coffee> findOneCoffee(String name){
ExampleMatcher matcher = ExampleMatcher.matching()
.withMatcher("name", exact().ignoreCase());
Optional<Coffee> coffee = coffeeRepository.findOne(Example.of(Coffee.builder().name(name).build(), matcher));
return coffee;
}
}
package com.example.cachedemo.service;
import com.example.cachedemo.model.Coffee;
import com.example.cachedemo.model.CoffeeOrder;
import com.example.cachedemo.model.OrderState;
import com.example.cachedemo.repository.CoffeeOrderRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Arrays;
@Slf4j
@Service
@Transactional
public class CoffeeOrderService {
@Autowired
private CoffeeOrderRepository orderRepository;
public CoffeeOrder createOrder(String customer, Coffee...coffee){
CoffeeOrder order = CoffeeOrder.builder()
.customer(customer)
.items(new ArrayList<>(Arrays.asList(coffee)))
.state(OrderState.INIT)
.build();
CoffeeOrder saved = orderRepository.save(order);
log.info("New Order: {}",saved);
return saved;
}
public boolean updateState(CoffeeOrder order,OrderState state){
if(state.compareTo(order.getState())<=0){
log.warn("Wrong state order:{}, {}",state,order.getState());
return false;
}
order.setState(state);
orderRepository.save(order);
log.info("Updated Order: {}",order);
return true;
}
}
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
drop table t_coffee if exists;
drop table t_order if exists;
drop table t_order_coffee if exists;
create table t_coffee (
id bigint auto_increment,
create_time timestamp,
update_time timestamp,
name varchar(255),
price bigint,
primary key (id)
);
create table t_order (
id bigint auto_increment,
create_time timestamp,
update_time timestamp,
customer varchar(255),
state integer not null,
primary key (id)
);
create table t_order_coffee (
coffee_order_id bigint not null,
items_id bigint not null
);
insert into t_coffee (name, price, create_time, update_time) values ('espresso', 2000, now(), now());
insert into t_coffee (name, price, create_time, update_time) values ('latte', 2500, now(), now());
insert into t_coffee (name, price, create_time, update_time) values ('capuccino', 2500, now(), now());
insert into t_coffee (name, price, create_time, update_time) values ('mocha', 3000, now(), now());
insert into t_coffee (name, price, create_time, update_time) values ('macchiato', 3000, now(), now());
本文来自博客园,作者:ukyo--碳水化合物,转载请注明原文链接:https://www.cnblogs.com/ukzq/p/13284193.html

浙公网安备 33010602011771号