Автоматическое сохранение сложного объекта Java - PullRequest
1 голос
/ 09 июня 2010

Для проекта, над которым я работаю, мне нужно сохранить несколько POJO в базе данных. Определения класса POJO иногда бывают сильно вложенными, но они должны сглаживаться, так как вложение является древовидным и не содержит циклов (а базовые элементы в конечном итоге являются примитивами / строками). Предпочтительно, чтобы используемое решение создавало одну таблицу для каждого типа данных, и чтобы таблицы имели одно поле на элемент-примитив в POJO. Подклассы и подобные проблемы не являются проблемами для этого конкретного проекта.

Кто-нибудь знает о существующих решениях, которые могут:

  1. Автоматически генерировать определение CREATE TABLE из определения класса
  2. Автоматически генерировать запрос для сохранения объекта в базе данных, учитывая экземпляр объекта
  3. Автоматически генерировать запрос для извлечения объекта из базы данных и возврата его в виде POJO с учетом ключа.

Решения, которые могут сделать это с минимальными изменениями / аннотациями к файлам классов и минимальной внешней конфигурацией, являются предпочтительными.


Пример:

Java-классы

//Class to be persisted
class TypeA {
  String guid;
  long timestamp;
  TypeB data1;
  TypeC data2;
}

class TypeB {
  int id;
  int someData;
}

class TypeC {
  int id;
  int otherData;
}

Может отображаться на

CREATE TABLE TypeA (
  guid CHAR(255),
  timestamp BIGINT,
  data1_id INT,
  data1_someData INT,
  data2_id INt,
  data2_otherData INT
);

или что-то подобное.

Ответы [ 5 ]

5 голосов
/ 09 июня 2010

Я бы использовал стандартизированный Java Persistence API (JPA), предпочтительно с аннотациями. Относительно ваших требований:

  1. Это не требуется спецификацией, но большинство провайдеров JPA (все основные реализации поддерживают) поддерживают генерацию DDL из метаданных отображения.
  2. EntityManager#persist(Object entity) делает это.
  3. <T> T EntityManager#find(Class<T> entityClass, Object primaryKey) делает это.

Как уже говорилось, JPA - это API, вам нужна реализация, чтобы использовать его. Я предпочитаю Hibernate Entity Manager или EclipseLink (см. этот предыдущий вопрос ).

1 голос
/ 09 июня 2010

Hibernate может помочь вам решить все три проблемы, которые вы перечислили.

(1) Вам необходимо аннотировать классы сущностей, чтобы Hibernate мог сопоставлять классы / объекты таблицам / строкам. В Hibernate используется соглашение о конфигурации, поэтому можно использовать всего несколько аннотаций и получить готовое к использованию полное отображение o / r. Можно использовать параметр конфигурации hibernate.hbm2ddl.auto, чтобы настроить Hibernate на автоматическую проверку / экспорт и DDL схемы при первом создании фабрики сеансов.

(2) / (3) Hibernate обладает достаточной информацией о классах, схеме базы данных и сопоставлениях, что позволяет с минимальными усилиями генерировать операторы SQL для простых операций CRUD. Вы можете настроить, как Hibernate загружает и сохраняет дерево объектов. У аннотаций сопоставления ассоциаций есть параметры выборки и каскада, которые позволяют указать, как выбираются связанные объекты (ленивые / энергичные) и как операции распространяются через дерево объектов. Пожалуйста, обратитесь к документации Hibernate для деталей об этих параметрах.

Если вы новичок в Hibernate, я рекомендую хорошую документацию по Hibernate в качестве справочного материала и книгу Сохранение Java с Hibernate для более глубокого понимания структуры (в ней есть очень хорошие разделы о извлечении и каскадировании).

В типичном сценарии Hibernate требует немного настройки (один файл hibernate.cfg.xml). Вы можете определить сопоставления, используя файлы XML (бесполезно) или аннотации (опция «по умолчанию» для новых проектов).

1 голос
/ 09 июня 2010

Настоятельно рекомендуемый фреймворк: JPersist , чрезвычайно простой фреймворк Database-to-POJO. Нет XML или аннотаций не требуется. Я использую его в своем проекте, потому что, если я хочу новый табличный объект, я просто создаю бин.

Проблема в вашей ситуации заключается в том, что вы хотите что-то настроить для себя. Делать это было бы очень сложно, и вы много просили от фреймворка. С JPersist вы сможете создавать таблицы БД из имени класса и столбцов из полей, а затем использовать конструктор phpMyAdmin для разрешения ссылок.

5 минут чтения документации для JPersist теперь сэкономят время на разработке позже.

1 голос
/ 09 июня 2010

Вы пометили свой вопрос как Hibernate. Вы пытались использовать Hibernate для этого?

Пока вы хорошо определяете, как должны отображаться коллекции (например, один ко многим), я считаю, что в целом это очень эффективно для такого рода вещей.

В руководствах по Hibernate приведено множество примеров ситуаций, похожих на предоставленный вами код.

0 голосов
/ 10 июня 2010

JPA предоставляет достаточно возможностей для этого. Например, вы можете использовать @Embeddable и @Embedded:

@Embeddable
class TypeB {
  int id;
  int someData;
}


class TypeA {
  ....
  @Embedded
  TypeB data1;
}

Вы можете либо создать базовую схему вручную, либо позволить что-то вроде hbm2ddl.auto=update создать ее для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...