Столбец дискриминатора Hibernate JPA не добавлен к сгенерированному запросу

У меня есть абстрактный объект, использующий DiscriminatorColumn, и он подклассифицируется различными объектами. Теперь, когда я запрашиваю именованный запрос в абстрактном классе, он выдает ошибку: «org.hibernate.InstantiationException Не удается создать экземпляр абстрактного класса или интерфейса». При анализе я обнаружил, что столбец дискриминатора не добавляется в сам сгенерированный собственный SQL. Ниже приведена упрощенная версия сопоставления сущностей:

  package com.qz.test;

import javax.persistence.*;

/**
 * User: r4rao
 * Date: 7/18/11
 * Time: 5:36 PM
 */
@Entity
@Table(schema = "ems", name = "nlt_content_profile")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "content_profile_type", discriminatorType = DiscriminatorType.STRING)
@NamedQueries({
        @NamedQuery(name = "A.getProfilesForDelivery", query = "select pcp from A pcp where pcp.serviceId = :service_id ")
//      @NamedQuery(name = "A.getProfilesByIdsForDelivery", query = "select pcp,s from A pcp,Subscription s LEFT JOIN FETCH s.client c LEFT JOIN FETCH c.operator where pcp.id in (:cp_ids) and pcp.service.id = :service_id and s.contentProfile.id = pcp.id and s.status in (:statuses) and  (:use_timestamp = false or (:use_timestamp = true and s.beginningTime < :timestamp)))"),
//      @NamedQuery(name = "A.removeUnusedContentProfiles", query = "DELETE FROM A pcp WHERE NOT EXISTS(SELECT 1 FROM Subscription sub WHERE sub.contentProfile.id = pcp.id)"),
//      @NamedQuery(name = "A.getProfileIdsForDelivery", query = "select pcp.id from A pcp where pcp.service.id = :service_id and exists(select 1 from Subscription s where s.contentProfile.id = pcp.id and s.status in (:statuses))")
})
public abstract class A{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "ContentProfileSeq")
    @SequenceGenerator(name = "ContentProfileSeq", sequenceName = "ems.nlt_content_profile_seq")
    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }


    @Column(name = "service_id")
    private Long serviceId;

    public Long getServiceId() {
        return serviceId;
    }

    public void setServiceId(Long serviceId) {
        this.serviceId = serviceId;
    }
}

package com.qz.test;

import javax.persistence.*;

/**
 * User: r4rao
 * Date: 7/18/11
 * Time: 5:36 PM
 */
@Entity
public class B extends A {
    @Column(name = "subscription_parameter")
    private String param;

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();
        sb.append("B");
        sb.append("{param='").append(param).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

person Ravi Rao    schedule 04.08.2011    source источник


Ответы (2)


Я понял, что это из-за ошибки конфигурации. В файле persistence.xml был настроен только абстрактный класс, в то время как конфигурация для любого конкретного подкласса отсутствовала. При добавлении конфигурации для конкретных классов эта ошибка была устранена.

Удивительно, но вместо того, чтобы выдать соответствующую ошибку, он не добавлял предложение фильтра с использованием столбца дискриминатора в сгенерированном запросе.

person Ravi Rao    schedule 05.09.2011

Ваш именованный запрос выбирает из A, что означает «дайте мне все экземпляры A и его подклассов, которые соответствуют заданным критериям». У Hibernate нет причин фильтровать столбец дискриминатора, поскольку вы все равно ищете его все возможные значения.

Рассматриваемая ошибка, скорее всего, вызвана неправильными данными в базовой таблице базы данных, например. у вас есть записи со значением столбца дискриминатора, указывающим на «A». Hibernate пытается создать экземпляр класса A для их хранения и не может (поскольку он абстрактный), поэтому выдает ошибку.

person ChssPly76    schedule 04.08.2011