Spring Data JPA + Hibernate:如何在抽象超类上使用存储库进行对象检索?

时间:2013-05-20 15:56:47

标签: java hibernate inheritance spring-data spring-data-jpa

我要求作为this question的后续行动。我正在做同样的事情并且它不起作用,这意味着它仍然提供一个异常,表示尝试实例化一个抽象类:

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通过Id获取Activity时,它会提供上述异常。

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

我正在使用Spring Data 1.2.0和Hibernate 4.1.7。

很抱歉提出单独的问题,但我无法评论原来的问题

1 个答案:

答案 0 :(得分:2)

我设法解决了这个问题。发生这种情况的主要原因是这种层次结构被引入到我们现有的系统中,这意味着在此更改之前我们在数据库中有数据。 Activity类之前是一个具体类,并且子类的表不存在。添加此层次结构时,我们为子类创建了表;但是,我错过的是需要在适当的表中为每个Activity对象插入一个条目,用于它实例化的子类。

我在一个条目上尝试了这个,我设法通过Id成功获取该活动。因此,我们应该运行脚本以正确插入适当表中所有现有活动条目的子类条目。

事实证明this answer已经注意到了这一点,但不知怎的,我注意到了对Discriminator值的检查,但是没有必要检查每个条目在相应的子类表中是否有一行。

相关问题