0

我正在尝试使用 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 无法转换为 VoipHistoryCall。

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

4

2 回答 2

4

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

于 2013-03-18T11:39:22.833 回答
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
}
于 2013-03-18T11:40:06.640 回答