2016-01-01 2 views
0

У меня есть объект JPA, которые могут быть отнесены к югу, определяется следующим образом:Получение подклассы от EntityManager.find()

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "IDTYPE", 
    discriminatorType = DiscriminatorType.STRING, 
    length = 12) 
public class BaseObject implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    //etc 

Преимущество этого в том, что BaseObject и все его подклассы доли одно и то же поле идентификатора - каждое значение уникально для всех из них. Мой вопрос, когда я делаю EntityManager.find() на базовый класс, как это:

@PersistenceContext protected EntityManager em; 

// find a record. 

BaseObject obj = em.find(BaseObject.class, longIDValue); 

Будет ли найти метод вернуть один из подклассов, если он использует этот конкретный идентификатор? Или он всегда будет возвращать только объект BaseClass?

Последующий вопрос: совместимо ли это поведение между различными реализациями JPA? (например, Hibernate vs. EclipseLink)

+0

и что происходит, когда вы это делаете? Когда я делаю это с DataNucleus JPA, я получаю правильный тип ... я могу быть подклассом. Точно так же, как спецификация JPA –

+0

@NeilStockton У меня возникли проблемы с моим приложением, поэтому я еще не испытал это. Но даже если это работает, я хотел бы убедиться, что я не делаю что-то зависимое от реализации. Я пропустил это в спецификации - если вы можете опубликовать ссылку на нее, я буду отмечать ее как ответ. – AlanObject

+1

Вы уверены, что хотите/нуждаетесь в супер сущности с объединенным наследованием? Это приведет к критическому замедлению, особенно к отношениям * @ OneToMany/@ ManyToMany *. –

ответ

2

EntityManager.find() возвращает экземпляр типа для указанного «id» и entityClass. Если у вас есть наследование и предоставлен суперкласс, а «id» подразумевает экземпляр подкласса, то это возвращает подкласс (полиморфизм). Вся причина, по которой существуют дискриминаторы, добавленные в таблицы, - это позволить реализации обеспечить такую ​​обработку для вас.

Описание JPA спецификации из find() (не то, что они потрудились, добавив много описания) не явно состояния такого поведения, хотя он должен делать, как описано выше, чтобы соответствовать основнымам JPQL запрос «SELECT b FROM BaseClass b», который будет возвращать экземпляры SubClass, где объект имеет этот тип.