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

时间:2014-11-14 16:18:30

标签: java playframework ebean

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

我的问题:

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

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

  3. 任何建议或文档链接都将受到赞赏。

    谢谢!

2 个答案:

答案 0 :(得分:7)

Play Framework 2.4解决方案,使用Ebean:

在应用程序启动时加载初始数据

首先,创建一个要执行初始数据加载的类。根据文档has to be in the constructor.

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"));
        }
    }
}

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

其次,根据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();
    }
}

确保将MainModule类添加到application.conf

# modules
play.modules.enabled += "module.MainModule"

答案 1 :(得分:3)

通过进一步搜索,我发现解决方案描述为here

执行初始插入的代码需要挂钩到Play的启动。

  

挂钩Play的启动就像创建一个名为Global的类一样简单,该类在根包中实现GlobalSettings,并覆盖onStart()方法。现在让我们这样做,通过创建app / Global.java文件到Play的启动就像创建一个名为Global的类一样简单,该类在根包中实现GlobalSettings,并覆盖onStart()方法。现在让我们通过创建app / Global.java文件

来做到这一点

请注意,它表示该类需要位于根包中。

代码示例:

import play.*;
import play.libs.*;
import com.avaje.ebean.Ebean;
import models.*;
import java.util.*;

public class Global extends GlobalSettings {
    @Override
    public void onStart(Application app) {
        // Check if the database is empty
        if (User.find.findRowCount() == 0) {
            Ebean.save((List) Yaml.load("initial-data.yml")); // You can use whatever data source you have here. No need to be in YAML.
        }
    }
}