1

我问这个问题的后续行动。我正在做完全相同的事情,但它不起作用,这意味着它仍然给出一个异常,指示尝试实例化一个抽象类:

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。

很抱歉作为一个单独的问题提出,但我无法对原始问题发表评论

4

1 回答 1

2

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

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

事实证明这个答案已经注意到了这一点,但不知何故,我注意到了对鉴别器值的检查,但错过了检查每个条目在相应的子类表中是否有一行的需要。

于 2013-05-22T07:04:27.520 回答