2015-10-08 2 views
0

Мне нужно создать базу данных с двумя типами «модулей».datanucleus/JDO отношение ко многим различным классам)

  1. домена ориентированные классы
  2. метаданных классы

В первой группе это просто простой (или сложной, а) СУБД. Второй «блок» - это классы метаданных, которые собирают информацию о классах из первого блока.

То, что я сделал:

  1. создал класс сущностей, который является предком всех Фро 1-й части:

    @PersistenceAware 
    @Inheritance(strategy = InheritanceStrategy.NEW_TABLE) 
    public abstract class Entity implements Serializable { 
    private static final long serialVersionUID = 1L; 
    } 
    
  2. создания нормальной схемы со всеми субъектами наследуют как-то Entity класса.

  3. Создано InternalMapping класс как родитель всего понятия.

    @PersistenceCapable 
    @Inheritance(strategy = InheritanceStrategy.NEW_TABLE) 
    public abstract class InternalMapping implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private Entity entity; 
    //.. cut off getter and setter 
    } 
    
  4. Создан InternalMapping ребенка, который должен иметь эту функцию.

И наконец, я нашел, что это не работает. Вероятно, потому что у Entity нет поля. Но если так, то я бы ожидал 2 поля: a primary key и class name. Таким образом, я бы обозначил каждую сущность на 2 координаты: ID и class name.

Любая идея, как решить эту проблему? Наконец, как выглядит JDOQL.

Ps. Я знаю, что RDBMS - не лучшее решение для таких проблем, но люди, с которыми я работаю, хотят иметь реляционную базу данных.

+0

Большое спасибо, ребята за текстовые издания. Выглядит намного лучше. – Jacek

+0

* какой * не работает? создание схемы? в этом случае, что говорит журнал? JDOQL для чего? Откуда это «название класса»? вы не определили дискриминатор –

+0

Созданная схема не имеет соответствующих полей на стороне InternalMapping. Однако я подумал об этом и, вероятно, нашел решение для этого, используя AOP. Я расскажу о завтрашнем дне после тестов. – Jacek

ответ

0

Наконец-то я нашел решение для своей проблемы. Я могу держать объекты разных классов в одной таблице. Также я могу выполнить запрос JDOQL с фильтрацией экземпляров определенного класса.

Пример находится внутри репозитория GitHub здесь: https://github.com/jgrzebyta/samples-jdo/tree/metalink и в пределах metalink филиал. Немного изменено Учебное пособие проект от datanucleus пример.

So.

Самый низкий уровень в иерархии наследования - это Core интерфейс с PK, определенный внутри.

Класс MyIndex собирает различные реализации интерфейса Core, то есть Book и Product. Также я добавил новый столбец под названием type для хранения только Class.Я могу получить реализации интерфейса Core и построить фильтр запросов на type, потому что тип запроса core instanceof Book не работает. Это особенность стратегии отображения identity, которую я использовал в своем решении: DataNucleus JDO Objects.

PS. Если вы запустите команду mvn -Pschema-gen compile, то вы получите файл DDL.

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