如何使用PostgreSQL的json和jsonb数据类型进行Java对象映射

3

我曾尝试使用Apache Cayenne将其映射到我的具有json和jsonb数据类型的PostgreSQL模式。然而,Apache Cayenne建模器没有这些数据类型,并将其更改为“OTHER”。当我执行SQL重新创建数据库(必要时为了最大兼容性)时,它会抛出错误。

我随后尝试寻找替代方案,比如DataNucleus,以便将其映射到PostgreSQL的json和jsonb数据类型。但是我发现Java驱动程序不支持PostgreSQL 9.x。(因此我认为DataNucleus JPO不支持PostgreSQL json和jsonb类型。)

那么,有什么解决方案可以将其映射到PostgreSQL的json和jsonb,并与基于Java的应用程序的数据写入/检索进行交互呢?

1个回答

4

Apache Cayenne可以直接读写PostgreSQL JSON列。您可以将它们映射为Java端的字符串属性。但这就是全部。没有什么特别的魔法。我刚刚尝试了使用GitHub主版本(Cayenne 4.0)和PostgreSQL 9.5 Docker镜像:

CREATE TABLE json_test (
    id SERIAL,
    x json
);

现在是Cayenne代码:
ObjectContext context = ...
JsonTest t = context.newObject(JsonTest.class);
t.setX("{\"m\":1}");
context.commitChanges();

List<JsonTest> list =
     ObjectSelect.query(JsonTest.class).select(context);

“正向工程”数据库模式不起作用,因为Cayenne以JDBC的方式以独立于数据库的方式存储其模型,因此没有关于特定数据库类型的信息。

Andrus,感谢您的回答和提示,“前向工程”不起作用!我想进一步澄清:如何在datamap文件(即Cayenne Modeler中)中维护映射信息?-虽然我十多年前是WebObjects开发人员,但我对Apache Cayenne还是很新手:) - ikevin8me
最佳方法是DB-first - 您设计您的DB模式,使用一些迁移框架来维护模式版本控制,并使用反向工程来保持ORM模型同步,以及类生成 - 以保持Java层同步。欢迎订阅Cayenne用户列表,进行有关Cayenne最佳实践的一般讨论。 - andrus_a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接