【问题标题】:JPA -- Cannot instantiate abstract class exceptionJPA——无法实例化抽象类异常
【发布时间】:2011-10-02 07:21:22
【问题描述】:

FundOperationItem.java

@Entity
@Table(name = "OPERATION_ITEMS")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "D_TYPE", discriminatorType = DiscriminatorType.INTEGER)
public abstract class FundOperationItem implements Serializable {

   @ManyToOne(fetch = FetchType.LAZY, optional=false)
   @JoinColumn(name = "PARENT_OPERATION_ID", nullable=false)
   private FundOperation operation;

   public FundOperation getOperation() {
      return this.operation;
   }

   public void setOperation(final FundOperation operation) {
      this.operation = operation;
   }

}

ExchangeOperationItem.java

@Entity
@Table(name = "EXCHANGE_OPERATION_ITEMS")
@DiscriminatorValue(value="2")
public class ExchangeOperationItem extends FundOperationItem {

}

SimpleOperationItem.java

@Entity
@Table(name = "SIMPLE_OPERATION_ITEMS")
@DiscriminatorValue(value="1")
public class SimpleOperationItem extends FundOperationItem {

}

FundOperation.java

@Entity
@Table(name = "OPERATIONS")
public class FundOperation implements java.io.Serializable{

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "operation", fetch = FetchType.LAZY)
    private List<FundOperationItem> operationItems = new ArrayList<FundOperationItem>();

    public List<FundOperationItem> getOperationItems() {
        return this.operationItems;
    }

    public void setOperationItems(final List<FundOperationItem> operationItems) {
        this.operationItems = operationItems;
    }

}

以这种方式使用它:

@Test
public void test(){
    FundOperation oper = operationRepository.findById(1L);
    System.out.println(oper.getOperationItems().size());
}

遇到了这样的异常:

org.apache.openjpa.persistence.ArgumentException:无法实例化对象 ID 为“rba.pm.persistency.operation.FundOperationItem-1”的“rba.pm.persistency.operation.FundOperationItem”类型的抽象类;这可能表明该类的继承鉴别器配置不正确。

数据库内容:

Insert into OPERATIONS (OPERATION_ID) values (1);
Insert into OPERATIONS (OPERATION_ID) values (2);
Insert into OPERATIONS (OPERATION_ID) values (3);

Insert into OPERATION_ITEMS (OPERATION_ITEM_ID,PARENT_OPERATION_ID,D_TYPE) values (1,1,1);
Insert into OPERATION_ITEMS (OPERATION_ITEM_ID,PARENT_OPERATION_ID,D_TYPE) values (2,2,1);
Insert into OPERATION_ITEMS (OPERATION_ITEM_ID,PARENT_OPERATION_ID,D_TYPE) values (3,3,1);

Insert into SIMPLE_OPERATION_ITEMS (OPERATION_ITEM_ID) values (1);
Insert into SIMPLE_OPERATION_ITEMS (OPERATION_ITEM_ID) values (2);
Insert into SIMPLE_OPERATION_ITEMS (OPERATION_ITEM_ID) values (3);

我是不是做错了什么?

更新:

**有一个解决办法,如果在测试上面添加一个新行

    SimpleOperationItem sio = new SimpleOperationItem();

有效

    @Test
    public void test(){
        SimpleOperationItem sio = new SimpleOperationItem();
        FundOperation oper = operationRepository.findById(1L);
        System.out.println(oper.getOperationItems().size());
    }

注意:对象 'sio' 与 'oper' 没有任何关系。

任何想法,发生了什么? 这是类加载器的问题吗? 这是一个已知问题吗?

【问题讨论】:

  • 您要查找的行在 D_TYPE 列中是 1 还是 2?
  • 插入 OPERATION_ITEM (OPERATION_ITEM_ID,PARENT_OPERATION_ID,D_TYPE) 值 (1,1,1);插入 OPERATION_ITEMS (OPERATION_ITEM_ID,PARENT_OPERATION_ID,D_TYPE) 值 (2,2,1);插入 OPERATION_ITEMS (OPERATION_ITEM_ID,PARENT_OPERATION_ID,D_TYPE) 值 (3,3,1);
  • 为了实验 - 您可以尝试将 discriminatorType 从 INTEGER 更改为 STRING 吗?此外,您确定在准备问题代码示例时保留了持久类的所有重要部分吗?例如,您省略了实体中的 PK。我只是想知道您是否遗漏了什么,实际情况与您描述的不同。
  • 感谢您的评论:我试过了——但没有任何改变。
  • 其实是有解决办法的。非常出乎意料,但是:如果在新行SimpleOperationItem sio = new SimpleOperationItem(); 上方添加测试,一切都会完美运行.... 注意:SimpleOperationItem 是 FundOperationItem 的子项。因此,如果实例化它——将有可能通过它的超类来解决它... 任何想法,发生了什么?这是类加载器的问题吗?这是一个已知问题吗?

标签: java jakarta-ee jpa


【解决方案1】:

未对此进行测试,但请在FundOperationItem 中尝试以下操作:

@DiscriminatorValue(value="0")

【讨论】:

    猜你喜欢
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2015-10-06
    • 2012-09-08
    • 1970-01-01
    相关资源
    最近更新 更多