【发布时间】:2017-11-11 10:09:05
【问题描述】:
我刚刚开始使用 Spring Boot 应用程序。我正在关注Java Brain's Spring Boot playlist。
设置:
对于 CRUD 操作,我使用 CrudRepository(@Repository) 接口作为父接口,通过 Controller(@RestController) 促进 API 的使用,Apache Derby 用作应用程序数据的嵌入式数据库 (@Entities)。 @RestController 和 @Repository 之间的桥接是使用 @Service 注释类完成的。
问题:
每当我重新启动 Spring Boot 应用程序时,我都会丢失使用 POST @RequestBody 存储到嵌入式数据库中的所有数据。如果我想将一些数据存储到数据库中,我必须再次执行POST 请求。对于我来说,无论是开发还是生产,这显然都不是一个好习惯,我一定做错了什么。
回购:
@Repository
public interface DailyRashifalRepository extends
CrudRepository<DailyRashifalEntity, String> {
}
实体:
@Entity
@Table(name="daily_rashifal")
public class DailyRashifalEntity {
@Id
private String id;
private String rashifal;
private int yr;
private int month;
private int day;
public DailyRashifalEntity(String id, String rashifal, int yr, int month, int day) {
super();
this.id = id;
this.rashifal = rashifal;
this.yr = yr;
this.month = month;
this.day = day;
}
private DailyRashifalEntity() {
super();
}
//Getters and setters
// equals to and hascode overrides
}
应用:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
服务:
@Service
public class RashifalService {
@Autowired
DailyRashifalRepository dailyRepo;
@Autowired
WeeklyRashifalRepository weeklyRepo;
@Autowired
MonthlyRashifalRepository monthlyRepo;
@Autowired
YearlyRashifalRepository yearlyRepo;
public List<DailyRashifalEntity> getDailyAll(int year, int month, int day) {
List<DailyRashifalEntity> rashiList = new ArrayList<DailyRashifalEntity>();
dailyRepo.findAll().forEach(rashiList::add);
return rashiList;
}
public DailyRashifalEntity getDaily( String id, int year, int month, int day) {
return dailyRepo.findOne(id);
}
public void addDaily(DailyRashifalEntity entity) {
dailyRepo.save(entity);
}
public void addDailyAll(List<DailyRashifalEntity> entityList) {
for(int i=0;i<entityList.size();i++){
dailyRepo.save(entityList.get(i));
}
}
public void updateDaily(DailyRashifalEntity entity) {
dailyRepo.save(entity);
}
.....Other methods
}
控制器:
@RestController
public class RashifalController {
@Autowired
private RashifalService service;
//Daily Rashifal API
@RequestMapping("rashifal/daily")
public List<DailyRashifalEntity> getDailyRashifalAll() {
return service.getDailyAll(2017, 2, 3);
}
@RequestMapping("rashifal/daily/{id}")
public DailyRashifalEntity getDailyRashifal(@PathVariable String id) {
return service.getDaily(id,2017, 2, 3);
/*DailyRashifalEntity entity = new DailyRashifalEntity("3", "Ramro Din", 2074, 2, 28);
return entity;*/
}
@RequestMapping(method = RequestMethod.POST, value = "rashifal/daily")
public void addRashifalAll(@RequestBody List<DailyRashifalEntity> entityList) {
service.addDailyAll(entityList);
}
@RequestMapping(method = RequestMethod.PUT, value = "rashifal/daily/")
public void updateRashifalDailyAll(@RequestBody List<DailyRashifalEntity> entityList) {
service.updateDailyAll(entityList);
}
@RequestMapping(method = RequestMethod.DELETE, value = "rashifal/daily/delete_all")
public void deleteDailyAll(@RequestBody List<DailyRashifalEntity> entityList) {
service.deleteDailyAll(entityList);
}
@RequestMapping(method = RequestMethod.DELETE, value = "rashifal/daily/delete_all_by_day/{year}/{month}/{day}")
public void deleteDailyAllByDay(@PathVariable("year") int year, @PathVariable("month") int month,
@PathVariable("day") int day) {
service.deleteDailyAllByDay(year, month, day);
}
@RequestMapping(method = RequestMethod.DELETE, value = "rashifal/daily/delete_by_day/{id}/{year}/{month}/{day}")
public void deleteDailyByDay( @PathVariable("id") String id,@PathVariable("year") int year,
@PathVariable("month") int month, @PathVariable("day") int day) {
service.deleteDailyByDay(id,year, month, day);
}
}
Pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gurkhatech</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Spring boot api for rashifal REST api</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Application.properties:
server.port=8080
spring.thymeleaf.cache=false
我做错了什么?您可以看到所有代码 here 或者您可以看到 Github 中的代码(请关注 Stack Overflow 问题发布)。
【问题讨论】:
-
这就是嵌入式数据库的设计目的。它仅用于测试和演示目的。如果要持久化数据,则需要从 derby 转移到其他数据库。使用springboot,很容易做到这一点。只需设置一个数据库(postgres 或 mysql),然后在您的应用程序属性中添加该连接参数(以及您的 pom 中的必要依赖项并删除 derby 依赖项)。其余的将被处理,无需更改代码中的任何内容。
-
@pvpkiran 非常感谢您的有见地的回答,我可以问更多的是您可以为我提供一个很好的参考吗?
标签: java spring maven spring-mvc spring-boot