Как: сопоставление объектов Java с типами данных PostgreSQL json и jsonb

Я попытался использовать Apache Cayenne для сопоставления с моей схемой PostgreSQL, которая имеет типы данных json и jsonb. Средство моделирования Apache Cayenne не имеет типа данных и изменено на "OTHER". Когда я выполняю SQL для воссоздания базы данных (что необходимо для максимальной совместимости), возникают ошибки.

Затем я попытался найти альтернативу, например DataNucleus, для сопоставления с типами данных PostgreSQL json и jsonb, но только чтобы обнаружить, что драйвер Java не поддерживает PostgreSQL 9.x. (Поэтому я предполагаю, что DataNucleus JPO не поддерживает типы PostgreSQL json и jsonb.)

Итак, каковы решения для сопоставления с json и jsonb PostgreSQL и взаимодействия с записью / извлечением данных для приложения на основе Java?


person ikevin8me    schedule 30.08.2016    source источник


Ответы (1)


Чтение и запись столбцов PostgreSQL JSON работает в Apache Cayenne из коробки. Вы можете сопоставить их как атрибуты String на стороне Java. Но это почти все. Никакой особой магии. Я просто попробовал следующее, используя главную версию GitHub (Cayenne 4.0) и образ Docker PostgreSQL 9.5:

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 независимо от БД и, следовательно, не имеет информации о типах, специфичных для БД.

person andrus_a    schedule 30.08.2016
comment
Андрус, спасибо за ответ и подсказку, что форвард-инжиниринг не работает! Я хотел бы уточнить больше: как мне сохранить информацию о сопоставлении в файле карты данных (например, в Cayenne Modeler)? - Я новичок в Apache Cayenne, хотя я был разработчиком WebObjects более десяти лет назад :-) - person ikevin8me; 30.08.2016
comment
Лучший подход - сначала DB - вы проектируете свою схему БД, используете некоторую среду миграции для поддержки управления версиями схемы и применяете обратный инжиниринг, чтобы синхронизировать вашу модель ORM, и генерацию классов - чтобы поддерживать синхронизацию уровня Java. Не стесняйтесь подписаться на список пользователей Cayenne для общего обсуждения передового опыта Cayenne. - person andrus_a; 31.08.2016