在Cayenne中设置数据库路径

时间:2013-09-22 20:26:20

标签: java orm derby apache-cayenne

我打算在一个项目中使用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()时,控制台中的日志会显示:

  

信息:创建的连接池: jdbc:derby:memory:testdb; create = true

这是我在CayenneModeller中设置的内存中测试URL,而不是我在setupDataBase中设置的那个(是的,我做的就是调用该方法)。此外,未创建数据库文件(我使用调试器验证路径是否正确)。

那么,这个问题的规范解决方案是什么?

1 个答案:

答案 0 :(得分:3)

我认为你看到的日志输出来自这一行:

Configuration configuration = Configuration.getSharedConfiguration()

即。在安装之前加载默认的DataSource。虽然有办法破解3.0启动序列,但我强烈建议切换到Cayenne 3.1B2。它即将成为“RC”和“最终”,因此不要对其当前的Beta状态感到震惊。

可以在3.1中构建自定义DataSource的一种方法是在Cayenne DI模块中定义一些属性,如here所述,让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);