Skip to content

Commit aae2ed8

Browse files
Add files via upload
1 parent c199ba8 commit aae2ed8

10 files changed

+371
-0
lines changed
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
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+
6+
<groupId>com.jpa</groupId>
7+
<artifactId>jpa</artifactId>
8+
<version>1.0</version>
9+
<packaging>jar</packaging>
10+
11+
<name>jpa</name>
12+
<description>JPA project for Spring Boot</description>
13+
14+
<parent>
15+
<groupId>org.springframework.boot</groupId>
16+
<artifactId>spring-boot-starter-parent</artifactId>
17+
<version>2.0.5.RELEASE</version>
18+
<relativePath/> <!-- lookup parent from repository -->
19+
</parent>
20+
21+
<properties>
22+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
23+
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
24+
<java.version>1.8</java.version>
25+
<datasource-proxy.version>1.4.9</datasource-proxy.version>
26+
</properties>
27+
28+
<dependencies>
29+
<dependency>
30+
<groupId>org.springframework.boot</groupId>
31+
<artifactId>spring-boot-starter-data-jpa</artifactId>
32+
</dependency>
33+
<dependency>
34+
<groupId>org.springframework.boot</groupId>
35+
<artifactId>spring-boot-starter-jdbc</artifactId>
36+
</dependency>
37+
<dependency>
38+
<groupId>org.springframework.boot</groupId>
39+
<artifactId>spring-boot-starter-web</artifactId>
40+
</dependency>
41+
<dependency>
42+
<groupId>net.ttddyy</groupId>
43+
<artifactId>datasource-proxy</artifactId>
44+
<version>${datasource-proxy.version}</version>
45+
</dependency>
46+
<dependency>
47+
<groupId>mysql</groupId>
48+
<artifactId>mysql-connector-java</artifactId>
49+
<scope>runtime</scope>
50+
</dependency>
51+
<dependency>
52+
<groupId>org.springframework.boot</groupId>
53+
<artifactId>spring-boot-starter-test</artifactId>
54+
<scope>test</scope>
55+
</dependency>
56+
</dependencies>
57+
58+
<build>
59+
<plugins>
60+
<plugin>
61+
<groupId>org.springframework.boot</groupId>
62+
<artifactId>spring-boot-maven-plugin</artifactId>
63+
</plugin>
64+
</plugins>
65+
</build>
66+
67+
68+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.jpa;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.boot.ApplicationRunner;
5+
import org.springframework.boot.SpringApplication;
6+
import org.springframework.boot.autoconfigure.SpringBootApplication;
7+
import org.springframework.context.annotation.Bean;
8+
9+
@SpringBootApplication
10+
public class BatchDeleteApplication {
11+
12+
@Autowired
13+
private TennisArenaService tennisArenaService;
14+
15+
public static void main(String[] args) {
16+
SpringApplication.run(BatchDeleteApplication.class, args);
17+
}
18+
19+
@Bean
20+
public ApplicationRunner init() {
21+
return args -> {
22+
23+
tennisArenaService.deletePlayers();
24+
};
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.jpa;
2+
3+
import net.ttddyy.dsproxy.listener.logging.SLF4JLogLevel;
4+
import net.ttddyy.dsproxy.support.ProxyDataSourceBuilder;
5+
import org.aopalliance.intercept.MethodInterceptor;
6+
import org.aopalliance.intercept.MethodInvocation;
7+
import org.springframework.aop.framework.ProxyFactory;
8+
import org.springframework.beans.factory.config.BeanPostProcessor;
9+
import org.springframework.stereotype.Component;
10+
import org.springframework.util.ReflectionUtils;
11+
12+
import javax.sql.DataSource;
13+
import java.lang.reflect.Method;
14+
import java.util.logging.Logger;
15+
16+
@Component
17+
public class DatasourceProxyBeanPostProcessor implements BeanPostProcessor {
18+
19+
private static final Logger logger
20+
= Logger.getLogger(DatasourceProxyBeanPostProcessor.class.getName());
21+
22+
@Override
23+
public Object postProcessAfterInitialization(Object bean, String beanName) {
24+
25+
if (bean instanceof DataSource) {
26+
27+
logger.info(() -> "DataSource bean has been found: " + bean);
28+
29+
final ProxyFactory proxyFactory = new ProxyFactory(bean);
30+
31+
proxyFactory.setProxyTargetClass(true);
32+
proxyFactory.addAdvice(new ProxyDataSourceInterceptor((DataSource) bean));
33+
34+
return proxyFactory.getProxy();
35+
}
36+
return bean;
37+
}
38+
39+
@Override
40+
public Object postProcessBeforeInitialization(Object bean, String beanName) {
41+
return bean;
42+
}
43+
44+
private static class ProxyDataSourceInterceptor implements MethodInterceptor {
45+
46+
private final DataSource dataSource;
47+
48+
public ProxyDataSourceInterceptor(final DataSource dataSource) {
49+
super();
50+
this.dataSource = ProxyDataSourceBuilder.create(dataSource)
51+
.name("DATA_SOURCE_PROXY")
52+
.logQueryBySlf4j(SLF4JLogLevel.INFO)
53+
.multiline()
54+
.build();
55+
}
56+
57+
@Override
58+
public Object invoke(final MethodInvocation invocation) throws Throwable {
59+
60+
final Method proxyMethod = ReflectionUtils.
61+
findMethod(this.dataSource.getClass(),
62+
invocation.getMethod().getName());
63+
64+
if (proxyMethod != null) {
65+
return proxyMethod.invoke(this.dataSource, invocation.getArguments());
66+
}
67+
68+
return invocation.proceed();
69+
}
70+
}
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.jpa;
2+
3+
import java.util.List;
4+
import org.springframework.stereotype.Service;
5+
import org.springframework.transaction.annotation.Transactional;
6+
7+
@Service
8+
public class TennisArenaService {
9+
10+
private final TournamentRepository tournamentRepository;
11+
12+
public TennisArenaService(TournamentRepository tournamentRepository) {
13+
this.tournamentRepository = tournamentRepository;
14+
}
15+
16+
@Transactional
17+
public void deletePlayers() {
18+
19+
List<Tournament> tournaments = tournamentRepository.findAll();
20+
tournaments.forEach(tournamentRepository::delete);
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.jpa;
2+
3+
import java.io.Serializable;
4+
import javax.persistence.Entity;
5+
import javax.persistence.FetchType;
6+
import javax.persistence.Id;
7+
import javax.persistence.JoinColumn;
8+
import javax.persistence.ManyToOne;
9+
import javax.persistence.Version;
10+
11+
@Entity
12+
public class TennisPlayer implements Serializable {
13+
14+
private static final long serialVersionUID = 1L;
15+
16+
@Id
17+
private Long id;
18+
19+
private String name;
20+
21+
@Version
22+
private long version;
23+
24+
@ManyToOne(fetch = FetchType.LAZY)
25+
@JoinColumn(name = "tournament_id")
26+
private Tournament tournament;
27+
28+
public Long getId() {
29+
return id;
30+
}
31+
32+
public void setId(Long id) {
33+
this.id = id;
34+
}
35+
36+
public String getName() {
37+
return name;
38+
}
39+
40+
public void setName(String name) {
41+
this.name = name;
42+
}
43+
44+
public Tournament getTournament() {
45+
return tournament;
46+
}
47+
48+
public void setTournament(Tournament tournament) {
49+
this.tournament = tournament;
50+
}
51+
52+
public long getVersion() {
53+
return version;
54+
}
55+
56+
@Override
57+
public boolean equals(Object obj) {
58+
if (this == obj) {
59+
return true;
60+
}
61+
if (!(obj instanceof TennisPlayer)) {
62+
return false;
63+
}
64+
return id != null && id.equals(((TennisPlayer) obj).id);
65+
}
66+
67+
@Override
68+
public int hashCode() {
69+
return 2018;
70+
}
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.jpa;
2+
3+
import java.io.Serializable;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
import javax.persistence.CascadeType;
7+
import javax.persistence.Entity;
8+
import javax.persistence.Id;
9+
import javax.persistence.OneToMany;
10+
import javax.persistence.Version;
11+
import org.hibernate.annotations.OnDelete;
12+
import org.hibernate.annotations.OnDeleteAction;
13+
14+
@Entity
15+
public class Tournament implements Serializable {
16+
17+
private static final long serialVersionUID = 1L;
18+
19+
@Id
20+
private Long id;
21+
22+
private String name;
23+
24+
@Version
25+
private long version;
26+
27+
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE},
28+
mappedBy = "tournament", orphanRemoval = false)
29+
@OnDelete(action = OnDeleteAction.CASCADE)
30+
private List<TennisPlayer> tennisPlayers = new ArrayList<>();
31+
32+
public void addTennisPlayer(TennisPlayer tennisPlayer) {
33+
this.tennisPlayers.add(tennisPlayer);
34+
tennisPlayer.setTournament(this);
35+
}
36+
37+
public void removeTennisPlayer(TennisPlayer tennisPlayer) {
38+
tennisPlayer.setTournament(null);
39+
this.tennisPlayers.remove(tennisPlayer);
40+
}
41+
42+
public Long getId() {
43+
return id;
44+
}
45+
46+
public void setId(Long id) {
47+
this.id = id;
48+
}
49+
50+
public String getName() {
51+
return name;
52+
}
53+
54+
public void setName(String name) {
55+
this.name = name;
56+
}
57+
58+
public List<TennisPlayer> getTennisPlayers() {
59+
return tennisPlayers;
60+
}
61+
62+
public void setTennisPlayers(List<TennisPlayer> tennisPlayers) {
63+
this.tennisPlayers = tennisPlayers;
64+
}
65+
66+
public long getVersion() {
67+
return version;
68+
}
69+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.jpa;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
import org.springframework.stereotype.Repository;
5+
6+
@Repository
7+
public interface TournamentRepository extends JpaRepository<Tournament, Long> {
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
spring.datasource.url=jdbc:mysql://localhost:3306/db_tennis?cachePrepStmts=true&useServerPrepStmts=true&rewriteBatchedStatements=true&createDatabaseIfNotExist=true
2+
spring.datasource.username=root
3+
spring.datasource.password=root
4+
5+
spring.jpa.hibernate.ddl-auto=create
6+
7+
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
8+
9+
spring.datasource.initialization-mode=always
10+
spring.datasource.platform=mysql
11+
12+
spring.jpa.properties.hibernate.jdbc.batch_size=7
13+
spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
INSERT INTO `db_tennis`.`tournament` (`id`, `name`, `version`) VALUES ('1', 'Tournament: 1', '0');
2+
INSERT INTO `db_tennis`.`tournament` (`id`, `name`, `version`) VALUES ('2', 'Tournament: 2', '0');
3+
INSERT INTO `db_tennis`.`tournament` (`id`, `name`, `version`) VALUES ('3', 'Tournament: 3', '0');
4+
INSERT INTO `db_tennis`.`tournament` (`id`, `name`, `version`) VALUES ('4', 'Tournament: 4', '0');
5+
6+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('1', 'Player: 1', '0', '1');
7+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('2', 'Player: 2', '0', '1');
8+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('3', 'Player: 3', '0', '1');
9+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('4', 'Player: 4', '0', '1');
10+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('5', 'Player: 5', '0', '1');
11+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('6', 'Player: 6', '0', '2');
12+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('7', 'Player: 7', '0', '2');
13+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('8', 'Player: 8', '0', '2');
14+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('9', 'Player: 9', '0', '2');
15+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('10', 'Player: 10', '0', '2');
16+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('11', 'Player: 11', '0', '2');
17+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('12', 'Player: 12', '0', '2');
18+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('13', 'Player: 13', '0', '3');
19+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('14', 'Player: 14', '0', '3');
20+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('15', 'Player: 15', '0', '3');
21+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('16', 'Player: 16', '0', '3');
22+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('17', 'Player: 17', '0', '4');
23+
INSERT INTO `db_tennis`.`tennis_player` (`id`, `name`, `version`, `tournament_id`) VALUES ('18', 'Player: 18', '0', '4');

0 commit comments

Comments
 (0)