Skip to content

Commit aedb289

Browse files
authored
Merge pull request #1 from geektime-geekbang/master
更新
2 parents b1436b9 + c0fdedb commit aedb289

File tree

84 files changed

+3457
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+3457
-0
lines changed

Chapter 3/jpa-complex-demo/.gitignore

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/target/
2+
!.mvn/wrapper/maven-wrapper.jar
3+
4+
### STS ###
5+
.apt_generated
6+
.classpath
7+
.factorypath
8+
.project
9+
.settings
10+
.springBeans
11+
.sts4-cache
12+
13+
### IntelliJ IDEA ###
14+
.idea
15+
*.iws
16+
*.iml
17+
*.ipr
18+
19+
### NetBeans ###
20+
/nbproject/private/
21+
/nbbuild/
22+
/dist/
23+
/nbdist/
24+
/.nb-gradle/
25+
/build/

Chapter 3/jpa-complex-demo/pom.xml

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<groupId>org.springframework.boot</groupId>
7+
<artifactId>spring-boot-starter-parent</artifactId>
8+
<version>2.1.2.RELEASE</version>
9+
<relativePath/> <!-- lookup parent from repository -->
10+
</parent>
11+
<groupId>geektime.spring.springbucks</groupId>
12+
<artifactId>jpa-complex-demo</artifactId>
13+
<version>0.0.1-SNAPSHOT</version>
14+
<name>jpa-complex-demo</name>
15+
<description>Demo project for Spring Boot</description>
16+
17+
<properties>
18+
<java.version>1.8</java.version>
19+
</properties>
20+
21+
<dependencies>
22+
<dependency>
23+
<groupId>org.springframework.boot</groupId>
24+
<artifactId>spring-boot-starter-data-jpa</artifactId>
25+
</dependency>
26+
27+
<dependency>
28+
<groupId>org.joda</groupId>
29+
<artifactId>joda-money</artifactId>
30+
<version>1.0.1</version>
31+
</dependency>
32+
<dependency>
33+
<groupId>org.jadira.usertype</groupId>
34+
<artifactId>usertype.core</artifactId>
35+
<version>6.0.1.GA</version>
36+
</dependency>
37+
38+
<dependency>
39+
<groupId>com.h2database</groupId>
40+
<artifactId>h2</artifactId>
41+
<scope>runtime</scope>
42+
</dependency>
43+
<dependency>
44+
<groupId>org.projectlombok</groupId>
45+
<artifactId>lombok</artifactId>
46+
<optional>true</optional>
47+
</dependency>
48+
<dependency>
49+
<groupId>org.springframework.boot</groupId>
50+
<artifactId>spring-boot-starter-test</artifactId>
51+
<scope>test</scope>
52+
</dependency>
53+
</dependencies>
54+
55+
<build>
56+
<plugins>
57+
<plugin>
58+
<groupId>org.springframework.boot</groupId>
59+
<artifactId>spring-boot-maven-plugin</artifactId>
60+
</plugin>
61+
</plugins>
62+
</build>
63+
64+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package geektime.spring.springbucks.jpademo;
2+
3+
import geektime.spring.springbucks.jpademo.model.Coffee;
4+
import geektime.spring.springbucks.jpademo.model.CoffeeOrder;
5+
import geektime.spring.springbucks.jpademo.model.OrderState;
6+
import geektime.spring.springbucks.jpademo.repository.CoffeeOrderRepository;
7+
import geektime.spring.springbucks.jpademo.repository.CoffeeRepository;
8+
import lombok.extern.slf4j.Slf4j;
9+
import org.joda.money.CurrencyUnit;
10+
import org.joda.money.Money;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.boot.ApplicationArguments;
13+
import org.springframework.boot.ApplicationRunner;
14+
import org.springframework.boot.SpringApplication;
15+
import org.springframework.boot.autoconfigure.SpringBootApplication;
16+
import org.springframework.data.domain.Sort;
17+
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
18+
import org.springframework.transaction.annotation.EnableTransactionManagement;
19+
20+
import javax.transaction.Transactional;
21+
import java.util.Arrays;
22+
import java.util.Collections;
23+
import java.util.List;
24+
import java.util.stream.Collectors;
25+
26+
@SpringBootApplication
27+
@EnableJpaRepositories
28+
@EnableTransactionManagement
29+
@Slf4j
30+
public class JpaDemoApplication implements ApplicationRunner {
31+
@Autowired
32+
private CoffeeRepository coffeeRepository;
33+
@Autowired
34+
private CoffeeOrderRepository orderRepository;
35+
36+
public static void main(String[] args) {
37+
SpringApplication.run(JpaDemoApplication.class, args);
38+
}
39+
40+
@Override
41+
@Transactional
42+
public void run(ApplicationArguments args) throws Exception {
43+
initOrders();
44+
findOrders();
45+
}
46+
47+
private void initOrders() {
48+
Coffee latte = Coffee.builder().name("latte")
49+
.price(Money.of(CurrencyUnit.of("CNY"), 30.0))
50+
.build();
51+
coffeeRepository.save(latte);
52+
log.info("Coffee: {}", latte);
53+
54+
Coffee espresso = Coffee.builder().name("espresso")
55+
.price(Money.of(CurrencyUnit.of("CNY"), 20.0))
56+
.build();
57+
coffeeRepository.save(espresso);
58+
log.info("Coffee: {}", espresso);
59+
60+
CoffeeOrder order = CoffeeOrder.builder()
61+
.customer("Li Lei")
62+
.items(Collections.singletonList(espresso))
63+
.state(OrderState.INIT)
64+
.build();
65+
orderRepository.save(order);
66+
log.info("Order: {}", order);
67+
68+
order = CoffeeOrder.builder()
69+
.customer("Li Lei")
70+
.items(Arrays.asList(espresso, latte))
71+
.state(OrderState.INIT)
72+
.build();
73+
orderRepository.save(order);
74+
log.info("Order: {}", order);
75+
}
76+
77+
private void findOrders() {
78+
coffeeRepository
79+
.findAll(Sort.by(Sort.Direction.DESC, "id"))
80+
.forEach(c -> log.info("Loading {}", c));
81+
82+
List<CoffeeOrder> list = orderRepository.findTop3ByOrderByUpdateTimeDescIdAsc();
83+
log.info("findTop3ByOrderByUpdateTimeDescIdAsc: {}", getJoinedOrderId(list));
84+
85+
list = orderRepository.findByCustomerOrderById("Li Lei");
86+
log.info("findByCustomerOrderById: {}", getJoinedOrderId(list));
87+
88+
// 不开启事务会因为没Session而报LazyInitializationException
89+
list.forEach(o -> {
90+
log.info("Order {}", o.getId());
91+
o.getItems().forEach(i -> log.info(" Item {}", i));
92+
});
93+
94+
list = orderRepository.findByItems_Name("latte");
95+
log.info("findByItems_Name: {}", getJoinedOrderId(list));
96+
}
97+
98+
private String getJoinedOrderId(List<CoffeeOrder> list) {
99+
return list.stream().map(o -> o.getId().toString())
100+
.collect(Collectors.joining(","));
101+
}
102+
}
103+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package geektime.spring.springbucks.jpademo.model;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
import org.hibernate.annotations.CreationTimestamp;
7+
import org.hibernate.annotations.UpdateTimestamp;
8+
9+
import javax.persistence.Column;
10+
import javax.persistence.GeneratedValue;
11+
import javax.persistence.Id;
12+
import javax.persistence.MappedSuperclass;
13+
import java.io.Serializable;
14+
import java.util.Date;
15+
16+
@MappedSuperclass
17+
@Data
18+
@NoArgsConstructor
19+
@AllArgsConstructor
20+
public class BaseEntity implements Serializable {
21+
@Id
22+
@GeneratedValue
23+
private Long id;
24+
@Column(updatable = false)
25+
@CreationTimestamp
26+
private Date createTime;
27+
@UpdateTimestamp
28+
private Date updateTime;
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package geektime.spring.springbucks.jpademo.model;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
import lombok.ToString;
8+
import org.hibernate.annotations.Type;
9+
import org.joda.money.Money;
10+
11+
import javax.persistence.Entity;
12+
import javax.persistence.Table;
13+
import java.io.Serializable;
14+
15+
@Entity
16+
@Table(name = "T_MENU")
17+
@Builder
18+
@Data
19+
@ToString(callSuper = true)
20+
@NoArgsConstructor
21+
@AllArgsConstructor
22+
public class Coffee extends BaseEntity implements Serializable {
23+
private String name;
24+
@Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmount",
25+
parameters = {@org.hibernate.annotations.Parameter(name = "currencyCode", value = "CNY")})
26+
private Money price;
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package geektime.spring.springbucks.jpademo.model;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
import lombok.ToString;
8+
9+
import javax.persistence.Column;
10+
import javax.persistence.Entity;
11+
import javax.persistence.Enumerated;
12+
import javax.persistence.JoinTable;
13+
import javax.persistence.ManyToMany;
14+
import javax.persistence.OrderBy;
15+
import javax.persistence.Table;
16+
import java.io.Serializable;
17+
import java.util.List;
18+
19+
@Entity
20+
@Table(name = "T_ORDER")
21+
@Data
22+
@ToString(callSuper = true)
23+
@NoArgsConstructor
24+
@AllArgsConstructor
25+
@Builder
26+
public class CoffeeOrder extends BaseEntity implements Serializable {
27+
private String customer;
28+
@ManyToMany
29+
@JoinTable(name = "T_ORDER_COFFEE")
30+
@OrderBy("id")
31+
private List<Coffee> items;
32+
@Enumerated
33+
@Column(nullable = false)
34+
private OrderState state;
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package geektime.spring.springbucks.jpademo.model;
2+
3+
public enum OrderState {
4+
INIT, PAID, BREWING, BREWED, TAKEN, CANCELLED
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package geektime.spring.springbucks.jpademo.repository;
2+
3+
import org.springframework.data.repository.NoRepositoryBean;
4+
import org.springframework.data.repository.PagingAndSortingRepository;
5+
6+
import java.util.List;
7+
8+
@NoRepositoryBean
9+
public interface BaseRepository<T, Long> extends PagingAndSortingRepository<T, Long> {
10+
List<T> findTop3ByOrderByUpdateTimeDescIdAsc();
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package geektime.spring.springbucks.jpademo.repository;
2+
3+
import geektime.spring.springbucks.jpademo.model.CoffeeOrder;
4+
5+
import java.util.List;
6+
7+
public interface CoffeeOrderRepository extends BaseRepository<CoffeeOrder, Long> {
8+
List<CoffeeOrder> findByCustomerOrderById(String customer);
9+
List<CoffeeOrder> findByItems_Name(String name);
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package geektime.spring.springbucks.jpademo.repository;
2+
3+
import geektime.spring.springbucks.jpademo.model.Coffee;
4+
5+
public interface CoffeeRepository extends BaseRepository<Coffee, Long> {
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
spring.jpa.hibernate.ddl-auto=create-drop
2+
spring.jpa.properties.hibernate.show_sql=true
3+
spring.jpa.properties.hibernate.format_sql=true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package geektime.spring.springbucks.jpademo;
2+
3+
import org.junit.Test;
4+
import org.junit.runner.RunWith;
5+
import org.springframework.boot.test.context.SpringBootTest;
6+
import org.springframework.test.context.junit4.SpringRunner;
7+
8+
@RunWith(SpringRunner.class)
9+
@SpringBootTest
10+
public class JpaDemoApplicationTests {
11+
12+
@Test
13+
public void contextLoads() {
14+
}
15+
16+
}
17+

Chapter 3/jpa-demo/.gitignore

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/target/
2+
!.mvn/wrapper/maven-wrapper.jar
3+
4+
### STS ###
5+
.apt_generated
6+
.classpath
7+
.factorypath
8+
.project
9+
.settings
10+
.springBeans
11+
.sts4-cache
12+
13+
### IntelliJ IDEA ###
14+
.idea
15+
*.iws
16+
*.iml
17+
*.ipr
18+
19+
### NetBeans ###
20+
/nbproject/private/
21+
/nbbuild/
22+
/dist/
23+
/nbdist/
24+
/.nb-gradle/
25+
/build/

0 commit comments

Comments
 (0)