использование наследования для целей типа данных в JPA - PullRequest
0 голосов
/ 07 января 2012

У меня есть несколько сущностей, которые выглядят так:

@Entity
public abstract class AbstractEntity{

    @Id
    private Long id;
    String name;
    User author;
    @Lob
    byte[] data;

}


public class EntityOne extends AbstractEntity{
    // nothing new
}


public class EntityTwo extends AbstractEntity{
    // nothing new
}


public class EntityThree extends AbstractEntity{
    // nothing new
}

byte[], определенный в суперклассе, является интересной частью каждой сущности подкласса. Причина, по которой я хочу создать подкласс, состоит в том, чтобы обеспечить соблюдение правил набора текста, поскольку для некоторых частей программы требуется EntityThree, а для некоторых частей программы требуется EntityTwo. byte[] будет иметь совершенно другое значение от подкласса к подклассу.

Это кажется немного странным, потому что я не ожидаю, что какой-либо из подклассов добавит какие-либо поля или методы ... Так что я использую наследование только в качестве инструмента ввода.

Это разумный дизайн? Лучший способ сделать это? Это нарушает какие-либо лучшие практики?

Ответы [ 2 ]

2 голосов
/ 07 января 2012

Это хорошая ОО практика.Для базы данных используйте стратегию наследования SINGLE_TABLE (по умолчанию) и, возможно, используйте настраиваемое значение @DiscriminatorValue для каждого подкласса, в противном случае вы получите имена классов в своей таблице.

С точки зрения администратора базы данных нет никакой разницы междуэто и использование одного класса со свойством TYPE.

Для ОО подклассы могут быть гораздо более полезными, например, вы можете использовать его для реализации определенных методов по-другому или реализации шаблона посетителя или стратегии вместо утомительного if-then-else или instanceof структуры.

0 голосов
/ 07 января 2012

Трудно сказать, не зная точного варианта использования, но похоже, что вы просто хотите повторно использовать общие поля во всех сущностях, но ни одна другая сущность не будет иметь ссылок на AbstractEntity - только на один конкретный подкласс. В этом случае вы должны отобразить суперкласс с @MappedSuperclass, а не с @Entity. Каждая сущность будет иметь свою собственную таблицу и может переопределить отображение, определенное в сопоставленном суперклассе.

Обратите внимание, что если я ошибаюсь, и вам действительно нужно наследование сущностей, использование instanceof, по крайней мере с Hibernate, вызовет проблемы, потому что у вас может быть прокси для базового класса, который еще не знает точный подкласс, на который указывает внешний ключ, и который, таким образом, не является экземпляром ни одного из подклассов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...