【问题标题】:Spring Data JPA + Hibernate: How do I use a repository on abstract super class for object retrieval?Spring Data JPA + Hibernate:如何使用抽象超类上的存储库进行对象检索?
【发布时间】:2013-05-20 15:56:46
【问题描述】:

我要求跟进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。

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

【问题讨论】:

  • 定义“它不起作用”。发生什么了?键盘炸了?屏幕漏水?什么?并显示您的代码。

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


【解决方案1】:

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

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

原来this answer 已经注意到这一点,但不知何故,我注意到了对鉴别器值的检查,但没有检查每个条目在相应的子类表中是否有一行。

【讨论】:

    猜你喜欢
    • 2018-04-09
    • 2012-12-28
    • 2012-04-12
    • 2013-05-01
    • 2015-12-29
    • 2011-05-15
    • 2011-04-19
    • 2019-10-05
    • 1970-01-01
    相关资源
    最近更新 更多