我打算在一个项目中使用Apache Cayenne,但实际上却很难正确设置它。
Cayenne tutorial显示了如何在CayenneModeller中设置数据库位置。我的问题是我想在运行时动态确定的路径上使用Apache Derby,但我找不到如何使Cayenne实际使用该路径的方法。
我试图这样设置路径:
private static boolean setupDataBase() {
String path = Globals.USER_DATA_DIRECTORY + File.separator + "db";
try {
DataSource dataSource = new PoolManager(
"org.apache.derby.jdbc.EmbeddedDriver",
"jdbc:derby:" + path + ";create=true",
1,
1,
null,
null
);
Configuration configuration = Configuration.getSharedConfiguration();
DataDomain domain = configuration.getDomain();
DataNode node = domain.getNode("MaciNode");
node.setDataSource(dataSource);
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
但是,当我稍后调用
DataContext.createDataContext()
时,控制台中的日志显示如下:那是我在CayenneModeller中设置的内存中测试URL,而不是我在
setupDataBase
中设置的内存中测试URL(是的,我确实做到了调用该方法)。另外,不会创建数据库文件(我已通过调试器验证路径正确)。那么,该问题的规范解决方案是什么?
最佳答案
我认为您看到的日志输出来自以下行:
Configuration configuration = Configuration.getSharedConfiguration()
即在安装您的数据源之前,将加载默认的数据源。尽管有多种方法可以破解3.0启动序列,但我强烈建议改用Cayenne 3.1B2。它即将成为“RC”和“最终”,因此请不要为它的当前Beta状态感到震惊。
可以在3.1中构建自定义DataSource的一种方法是,如here所述,在Cayenne DI模块中定义一些属性,并让Cayenne担心正确的启动顺序。修剪上面建议中不相关的部分,您的启动代码可能如下所示:
Module m1 = new Module() {
@Override
public void configure(Binder binder) {
binder.bindMap(Constants.PROPERTIES_MAP)
.put(Constants.JDBC_DRIVER_PROPERTY, "com.my.Driver")
.put(Constants.JDBC_URL_PROPERTY, "jdbc://db1_url")
.put(Constants.JDBC_USERNAME_PROPERTY, "db1login")
.put(Constants.JDBC_PASSWORD_PROPERTY, "db1password");
}
};
ServerRuntime r1 = new ServerRuntime("cayenne-project.xml", m1);