【问题标题】:Spring JPA how to make sure that data gets written into persistent storageSpring JPA 如何确保将数据写入持久存储
【发布时间】:2015-01-17 20:00:20
【问题描述】:

我正在尝试扩展此示例:https://github.com/scratches/jpa-method-security-sample,方法是在控制器中添加一个方法来“注册”,在该方法中将新用户动态添加到存储库中。在 import.sql 脚本中添加了默认的现有用户集。但是,我看到我的动态添加的用户在服务器重新启动时被清除了。您能否指出确保表格持续更新的方法。

这是我的注册方法代码:

@RequestMapping(value = "signup",method =  RequestMethod.GET)
    public String signup(Map<String, Object> model) {
        model.put("message","Sign up!");
        model.put("title", "Hello Signup");
        model.put("date", new Date());
        users.createUser();
        return "signup";
    }

 public void createUser() {
    User u = new User();
    u.setName("xxx");
    u.setPassword("spring");
    repo.save(u);
}

我还对loadUserByUserName 进行了更改,以便为新用户返回正确的权限。这适用于一个服务器会话,我可以使用新用户登录。但是,在服务器重新启动时,需要重新添加用户。我想防止这种情况发生。

我觉得我需要做一些更精细的事情,比如配置持久数据源。如果是这种情况,请您指出一些使用 java config 来执行此操作的资源。我刚从春天开始,这可能是一个基本问题,在我阅读的所有内容中,我不确定要遵循什么。

【问题讨论】:

  • 你在使用 Spring Boot 吗?

标签: spring spring-data-jpa


【解决方案1】:

由于您使用的是嵌入式内存 H2 数据库,因此数据不会在重新启动后保留。您应该远离嵌入式数据库,并且由于该应用程序基于spring-boot,您可以轻松地重新配置它并使用例如mysql,通过在 pom 中添加 mysql 依赖。

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

application.properties 中的适当数据库属性,例如

spring.datasource.url=jdbc:mysql://localhost/[YOUR DB]
spring.datasource.username=[YOUR USERNAME]
spring.datasource.password=[YOUR PASSWORD]
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

要记住的另一件事是,某些默认值特定于嵌入式 DB,例如 H2 DB。例如,ddl-auto property is set to create-drop

这意味着数据库模式将在创建 SessionFactory 时创建,并在关闭时删除。

此属性的值,例如MySql 默认设置为 none,这意味着您必须首先运行您的应用程序覆盖该属性(将其设置在 application.properties 中)

spring.jpa.hibernate.ddl-auto: create

这将首先从 import.sql 创建数据。首次启动后,将属性更改为update,重启后数据将持续存在

【讨论】:

  • 非常感谢!完美运行。我设置了 MySql 创建了数据库并合并了所有更改。只有一个问题。如果我想在基于 gradle 的实际项目中做类似的事情,我应该添加一个依赖项,例如:mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.6 在 gradle 下给出对吗?
  • np,很高兴它有帮助,对于您的问题,是的,只需使用 gradle 依赖语法
  • 对不起,但是当我尝试在我的 gradle 项目中做类似的事情时,我遇到了一个问题。我的基于 H2 的项目在这里:github.com/devdeep1987/MutiboProject/tree/master/MutiboServer。我删除了 build.gradle 中的 h2 依赖项并添加了 compile("mysql:mysql-connector-java:5.1.6") 并在 application.properties 中添加了属性,但是在启动时,我收到了一个错误,我在这里粘贴了:@ 987654325@。想知道我是否需要做更多的事情来配置 mysql 依赖项
  • 我检查过,如果我没有在 build.gradle 中添加任何 h2/mysql 依赖项,我会得到同样的错误,这意味着它根本不接受 mysql 依赖项。
猜你喜欢
  • 1970-01-01
  • 2015-09-04
  • 2015-03-05
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
相关资源
最近更新 更多