2013-05-20 3 views
1

Я спрашиваю, как следует за this question. Я делаю то же самое, и это не работает, а это означает, что он все еще дает исключение, указывающее на попытку создать экземпляр абстрактного класса:Spring Data JPA + Hibernate: Как использовать репозиторий для абстрактного суперкласса для извлечения объектов?

org.springframework.orm.jpa.JpaSystemException: org.hibernate.InstantiationException: не может создавать абстрактные класс или интерфейс

Единственное отличие состоит в том, что я не устанавливаю свои классы как реализацию интерфейса Serializable, но я решил, что это, вероятно, не причина, поэтому я подозреваю версию Spring и Hibernate.

поэтому в основном абстрактный класс выглядит примерно так:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@Table(name="activities") 
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING) 
public abstract class Activity 
{ 
    @Id 
    @Column(length=Fields.ID_FIELD_SIZE) 
    protected String id; 
    .... 

и двух подклассов

@Entity 
@Table(name="a_activities") 
@DiscriminatorValue("A") 
public class AActivity extends Activity 
{ 
... 

и

@Entity 
@Table(name="b_activities") 
@DiscriminatorValue("B") 
public class BActivity extends Activity 
{ 
... 

При использовании ActivityRepository для извлечения иной активности, Идентификатор дает указанное исключение.

@Qualifier("activity-repository") 
public interface ActivityRepository extends JpaRepository<Activity, String> 
{ 
} 

Я использую Spring Data 1.2.0 и Hibernate 4.1.7.

Извините за вопрос как отдельный вопрос, но я не мог прокомментировать оригинал

+0

Определите, что «это не работает». Что происходит? Клавиатура взрывается? Утечка экрана? Какие? И покажите свой код. –

ответ

2

мне удалось решить эту проблему. Основная причина этого заключается в том, что эта иерархия была внедрена в нашу существующую систему, что означает, что перед этим изменением были данные в базе данных. Класс Activity был конкретным классом раньше, а таблицы для подклассов не существовали. При добавлении этой иерархии мы создали таблицы для подклассов; однако я пропустил необходимость вставить запись для каждого объекта Activity в соответствующую таблицу для подкласса, который он создает.

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

Оказывается, this answer уже отмечает этот пункт, но как-то я отметил проверку значений Дискриминатора, но пропустил необходимость проверить, что каждая запись имеет строку в соответствующей таблице подкласса.