Можно ли удалить столбец дискриминатора в наследовании одной таблицы в Hibernate?

Мы используем наследование одной таблицы для каждой таблицы в нашем приложении. Это позволяет различным экземплярам одного и того же стека приложений работать с одними и теми же DAO, в то время как их сущности могут немного отличаться, потенциально содержа информацию, уникальную для данного экземпляра. Абстрактный класс определяет базовую структуру таблицы, а расширение определяет дополнительные столбцы, если это необходимо данному экземпляру:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "client")
public abstract class Client extends AbstractPersistable<Long> {
    // ...
}

приложение A:

@Entity
public class ClientSimple extends Client {
    private String name;
    // getter, setter
}

приложение B:

@Entity
public class ClientAdvanced extends Client {
    private String description;
    // getter, setter
}

Теперь DAO может работать с объектами Client для приложений A и B, но приложение B может определить дополнительную информацию для своего клиентского объекта, которая может быть прочитана методом менеджера, уникальным для приложения B:

приложение A:

Client client = new ClientSimple();
clientDao.save(client);

приложение B:

Client client = new ClientAdvanced();
clientDao.save(client);

К сожалению, это означает, что в каждой таблице есть столбец DTYPE (или любое другое название, которое я могу выбрать). Есть ли способ избавиться от этого? Он нам не нужен и занимает место в БД...

Спасибо!


EDIT

Важно отметить: @MappedSuperclass не работает. Мы используем QueryDSL в качестве уровня абстракции HQL. Это требует автоматически генерируемых классов Query Type для сохранения типов запросов. Однако они будут сгенерированы правильно, только если абстрактный класс аннотирован @Entity.

Это необходимо, потому что мы хотим сделать запрос к абстрактному классу Client, в то время как на самом деле запрашиваем ClientSimple в приложении A и ClientAdvanced в приложении B:

Так что в любом приложении это будет работать:

query.where(QClient.client.name.equals("something");

а в приложении B это будет работать:

query.where(QClientSimple.client.description.equals("something else");

EDIT2 - свести к минимуму

Похоже, все сводится к следующему: Могу ли я настроить hibernate во время развертывания, чтобы установить тип дискриминатора для унаследованной сущности на фиксированное значение. Таким образом, в моем примере Client всегда будет ClientSimple в одном приложении и ClientAdvanced в другом, так что мне не придется хранить эту информацию в базе данных?

Как я уже сказал: Каждое приложение будет экземпляром базового стека приложений. Каждое приложение может определить дополнительные колонки для своей локальной базы данных, но ВСЕ объекты будут одного типа для данного экземпляра, поэтому мы гарантируем, что дискриминатор всегда один и тот же, что делает его избыточным в базе данных и является примером использования конфигурации hibernate.

5
задан Pete 3 January 2012 в 13:56
поделиться