【问题标题】:Spring boot Database (Apache Derby) using CrudRepository gets erased everytime I relaunch the application每次我重新启动应用程序时,使用 CrudRepository 的 Spring Boot 数据库(Apache Derby)都会被删除
【发布时间】: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


【解决方案1】:

您需要一个数据库来保存数据,H2 和 Derby 是嵌入的,并且需要在启动时将数据编码到数据库中。要添加一个简单的 MySQL 数据库,您可以将其添加到您的 pom.xml:

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
    </dependency>

您需要在 application.properties 中为数据源设置属性,如下所示:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# Everything after the ? is optional but I have found recommended previously.
spring.datasource.url=jdbc:mysql://serverip:3306/databasename?useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
# Username and password
spring.datasource.username=user
spring.datasource.password=password

对于我之前在第一次开始时发现有用的参考资料如下: https://github.com/spring-projects/spring-petclinic 以及来自https://github.com/joshlong的大量Youtube视频和代码

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2014-01-15
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多