如何在Play Framework中使用Ebean将初始数据加载/插入数据库?

Kyl*_*yle 1 java playframework ebean

我需要一些初始数据(从csv文件)到数据库.我正在使用Ebean和Play!框架.我读了文档.它说使用YAML文件存储数据并调用Ebean.save().这是在测试中完成的.

我的问题:

  1. 我应该在哪里插入数据?(测试可能不是理想的地方,因为这些数据应该用于生产)

  2. 我可以编写自己的代码来从现有的csv文件中获取数据,而不是使用YAML文件吗?

任何建议或文档链接将不胜感激.

谢谢!

Bat*_*cid 7

一个Play Framework 2.4解决方案,使用Ebean在应用程序启动时加载初始数据:

首先,创建一个要执行初始数据加载的类.根据文档,这必须在构造函数中.

public class InitialData {
    public InitialData() {

        if (Ebean.find(User.class).findRowCount() == 0) {
            InputStream is = this.getClass().getClassLoader().getResourceAsStream("initial-data.yml");

            @SuppressWarnings("unchecked")
            Map<String, List<Object>> all = 
                (Map<String, List<Object>>)Yaml.load(is, this.getClass().getClassLoader());

            //Yaml.load("initial-data.yml"); //calls Play.application() which isn't available yet
            Ebean.save(all.get("users"));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我使用Yaml的load(InputStream is, ClassLoader classloader)方法而不是它的load(String resourceName)方法,因为它不起作用.我相信这是因为它使用了Play.application(),因为在应用程序启动之前它不可用.来源在这里

其次,根据Play文档,要在启动前执行代码,请使用Eager-bindings.这将导致您的InitialData构造函数中的代码执行.

public class MainModule extends AbstractModule implements AkkaGuiceSupport {
    @Override
    protected void configure() {
        //this is where the magic happens
        bind(InitialData.class).asEagerSingleton();
    }
}
Run Code Online (Sandbox Code Playgroud)

确保将MainModule类添加到application.conf中

# modules
play.modules.enabled += "module.MainModule"
Run Code Online (Sandbox Code Playgroud)