2

我计划在一个项目中使用 Apache Cayenne,但我很难正确设置它。

Cayenne 教程展示了如何在 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(是的,我确实做到了调用该方法)。此外,没有创建数据库文件(我用调试器验证了路径是正确的)。

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

4

1 回答 1

3

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

Configuration configuration = Configuration.getSharedConfiguration()

即默认数据源在您安装之前加载。虽然有一些方法可以破解 3.0 启动序列,但我强烈建议改用 Cayenne 3.1B2。它即将成为“RC”和“final”,所以不要对其当前的 Beta 状态感到惊慌。

在 3.1 中构建自定义 DataSource 的一种方法是在 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);
于 2013-09-23T11:03:06.647 回答