Как добавить свойство, учитываемое в БД, в класс @Entity? - PullRequest
3 голосов
/ 11 февраля 2011

У меня есть сущность. И иногда мне нужно, чтобы этот объект также содержал какое-то значение, называемое «глубина». Запрос может выглядеть как 'select b.id, b.name, b..., count(c.id) as depth from Entity b, CEntity c where ...'. Итак, я создал класс NonHibernateEntity, который расширяет Entity. И тогда результаты запроса, написанного выше, отлично сохраняются как List of NonHibEntity, который состоит из всех полей Entity (как они расширены) и свойства 'глубина' Я делаю это, устанавливая aliasToBean преобразователь результатов: .setResultTransformer(Transformers.aliasToBean(NHEntity.class)). Но это раздражает и неудобно - указывать все псевдонимы всех необходимых полей. И затем, если я хочу сохранить один из этих объектов в БД - session.saveOrUpdate((Enity)nHibEntity) - есть исключение, что nHibEntity не является Hibernate Entity.

Я слышал о сохранении «сущности» как поля в NonHibEntity (агрегация, а не наследование). Но, кажется, это тоже довольно неудобно. Как вы думаете? Какое решение подходит?

Ответы [ 2 ]

1 голос
/ 12 февраля 2011

A Формула сопоставление столбцов может соответствовать вашим потребностям.Я бы попробовал это первым.

Если это вызывает проблемы с производительностью, как вы боитесь, вы можете попробовать сопоставить иерархию классов с этим полем только в дочернем элементе и сопоставить обе таблицы с одной и той же таблицей.Не уверен, что на самом деле это будет работать ...

В крайнем случае, делайте то, что у вас есть сейчас, используя не отображенный класс, но с сущностью в качестве поля в другом классе - агрегация вместонаследование, как вы говорите, и убедитесь, что есть способ извлечь сопоставленную сущность из неотображенной, чтобы вы могли сохранить.Было бы разумно сделать его Decorator , чтобы он был и подклассом, и агрегатом, и вы можете продолжать игнорировать различие в большей части вашего кода./ или совокупность, однако, вам придется вытащить сущность, чтобы сохранить.

0 голосов
/ 23 февраля 2011

Если кто-то хочет знать - я решил эту проблему так:

только что сделал это вычисленное поле как @Transient, а затем

List<BaseEntry> result = new ArrayList<BaseEntry>();
    Iterator it =  session()
    .createQuery("select b, (select count(p.id) as depth from BaseEntry p " +
            "   where ... ) as d" +
            " from BaseEntry b " +
            " where ... ")
    .list().iterator();
    while ( it.hasNext() ) {
        Object[] row = (Object[]) it.next();
        BaseEntry entry = (BaseEntry) row[0];
        Long d = (Long) row[1];
        entry.setD(d);
        result.add(entry);
    }
    return result;

Работает хорошо, и кажется, что в будущем его можно будет легко поддерживать

...