Hibernate JPA Discriminator Column не добавляется в сгенерированный запрос - PullRequest
0 голосов
/ 04 августа 2011

У меня есть абстрактная сущность, использующая 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();
    }
}

Ответы [ 2 ]

1 голос
/ 05 сентября 2011

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

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

0 голосов
/ 04 августа 2011

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

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

...