datanucleus/JDO отношение ко многим различным классам)

Мне нужно создать базу данных с двумя типами «модулей».

  1. классы, ориентированные на предметную область
  2. классы метаданных

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

Что я сделал:

  1. Создан класс Entity, который является родительским для всей первой части:

    @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. Таким образом, я бы сопоставил каждую сущность по двум координатам: ID и class name.

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

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


person Jacek    schedule 08.10.2015    source источник
comment
Большое спасибо, ребята, за текстовые издания. Выглядит намного лучше.   -  person Jacek    schedule 08.10.2015
comment
что не работает? создание схемы? в этом случае что говорит журнал? JDOQL для чего? Откуда взялось это название класса? вы не определили дискриминатор   -  person Neil Stockton    schedule 08.10.2015
comment
Созданная схема не имеет соответствующих полей на стороне InternalMapping. Однако я думал об этом и, вероятно, нашел решение для этого с помощью АОП. Подробнее опишу завтра после тестов.   -  person Jacek    schedule 08.10.2015


Ответы (1)


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

Пример находится в репозитории GitHub здесь: https://github.com/jgrzebyta/samples-jdo/tree/metalink и в metalink ветке. Это слегка измененный проект Tutorial из примера datanucleus.

So.

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

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

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

person Jacek    schedule 10.10.2015