2010-06-09 6 views
1

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

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

  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 
); 

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

ответ

1

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

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

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

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

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

1

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

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

Учебники Hibernate предоставляют множество примеров ситуаций, которые похожи на предоставленный вами код.

+0

Я смотрел в Hibernate, но не смог найти никаких функций, которые позволили бы автоматически генерировать описания SQL, учитывая уже существующие описания классов. Знаете ли вы о какой-либо части спящего режима, которую можно использовать для этого (или это может послужить основой для какого-то Googling)? – VeeArr

+0

Вам нужен фактический SQL для ведения журнала? Я имею в виду, что Hibernate будет выполнять SQL для всего этого, включая создание ваших таблиц в выбранной вами базе данных. Существует опция ведения журнала, которая позволяет также сбрасывать SQL. Если вы действительно хотите манипулировать SQL в своей программе (почему?), Это может быть выполнимо, но я не уверен, как это сделать. – Uri

+0

Я не понял, извините. Я имел в виду, что я не хотел, чтобы мне приходилось самостоятельно создавать таблицы вручную, и я не хотел, чтобы я делал однополярное сопоставление объектов Java с полями в базе данных. Мне не нужно использовать фактический SQL (кроме, возможно, протоколов, как вы сказали). – VeeArr

1

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

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

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

+1

JPersist выглядит очень соблазнительно из-за отсутствия необходимости в аннотации или картировании.Однако за несколько минут, потраченных на документацию, мне показалось, что мне нужно вручную настроить таблицы базы данных раньше времени. К сожалению, поскольку типы данных могут иметь до 100 полей каждый, и существует около 100 типов данных, я бы предпочел не делать этого. – VeeArr

5

Я бы использовал стандартизованный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 (см. this previous question).

+1

+1 за то, что он был единственным, кто рекомендовал JPA. Возможно, ссылку на учебник EE 6 [JPA] (http://java.sun.com/javaee/6/docs/tutorial/doc/bnbpz.html). – Justin

+0

@ Justin На самом деле гораздо лучшее звено. Ответ обновляется. Благодарю. –

0

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

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


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

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

Смежные вопросы