我需要一些初始数据(来自csv文件)到数据库中。我正在使用Ebean和Play!框架。我读了doc。它说使用YAML文件存储数据并调用Ebean.save()。这是在测试中完成的。
我的问题:
我应该在哪里插入数据? (测试可能不是理想的地方,因为这些数据应该用于生产)
我可以编写自己的代码来从现有的csv文件中获取数据,而不是使用YAML文件吗?
任何建议或文档链接都将受到赞赏。
谢谢!
答案 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.
}
}
}