【问题标题】:JPA Cast ExceptionJPA 转换异常
【发布时间】:2013-03-06 17:33:53
【问题描述】:

我正在尝试使用 Oracle 和 JPA 构建数据库模式。我是 JPA 的新手,我总是直接使用 sql。 我需要创建两个表:第一个包含当前的 VOIP 呼叫,另一个包含这些呼叫的历史记录。这两个表是相同的。 在 JPA 中我写了这个:

@Entity
@Table(name = "voip_currentCalls")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class VoipCurrentCall implements Serializable {

    private static final long serialVersionUID = 1L;
    protected CompositeID id;
    protected Timestamp startTime;
    protected Timestamp endTime;
    protected String calledNumber;
    protected String callingNumber;    
    protected Person contact;
    protected CallSource source;
    protected CallStatus status;
    protected CallType type;
    protected CallStage stage;

@Entity
@Table(name = "voip_historyCalls")
public class VoipHistoryCall extends VoipCurrentCall implements Serializable {
...

如您所见,第二个表没有其他字段,但它只是第一个表的扩展。 当我尝试将 VoipCurrentCall 转换为 VoipHistoryCall 时,我得到 java.lang.ClassCastException: VoipCurrentCall cannot be cast to VoipHistoryCall。

你有什么建议吗?我可能错过了一些东西。 提前感谢大家!

【问题讨论】:

  • 您不能将超类转换为子类。

标签: java database oracle jpa


【解决方案1】:

这是 Java 的设计方式;你不能把一个超类转换为一个子类,反之亦然。它与 JPA 没有任何关系。

【讨论】:

  • 我非常专注于 JPA,而 netbeans 并没有证明我的愚蠢,所以我突然认为这是 JPA 的问题!原谅我!!
【解决方案2】:

好吧,如果您尝试投射的对象不是历史调用,那么投射肯定会失败。 JPA 实体仍然绑定到与常规 Java 对象相同的转换规则。举个例子:

Object obj = new Object();
String str = (String) obj;

上面会在运行时产生一个类转换异常,如果一个字符串是一个对象,如果对象不是一个字符串都没有关系。就您的 JPA 设计而言,您实际上应该稍有不同。 JPA 提供了一些标准方法来定义继承层次结构。在您的情况下,我建议使用@MappedSuperclass。像这样的:

@MappedSuperclass
public abstract class BaseVoipCurrentCall implements Serializable {

    @Id
    private CompositeID id;

    private Timestamp startTime;
    private Timestamp endTime;
    private String calledNumber;
    private String callingNumber;    
    private Person contact;
    private CallSource source;
    private CallStatus status;
    private CallType type;
    private CallStage stage;

    // Constructors, getters/setters
}

@Entity
@Table(name = "voip_currentCalls")
public class VoipCurrentCall extends BaseVoipCurrentCall {
    // Voip current call specific attributes and logic
}

@Entity
@Table(name = "voip_historyCalls")
public class VoipHistoryCall extends BaseVoipCurrentCall {
    // Voip history call specific attributes and logic
}

【讨论】:

  • 非常感谢您的宝贵建议!我的第一个错误是我愚蠢地忘记了 java 继承规则,把所有的错都归咎于 JPA(对我来说这仍然是一个很大的晦涩技术),但正如你所证明的那样,还有一个设计问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多