2013-03-18 4 views
0

Я пытаюсь построить схему db с Oracle и JPA. Я новичок в JPA, я всегда работал непосредственно с sql. Что мне нужно сделать, это две таблицы: первая, содержащая текущие вызовы VOIP, а другая - история этих вызовов. Две таблицы идентичны. В JPA я писал:JPA Cast Exception

@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.

Есть ли у вас какие-либо предложения? Вероятно, я что-то пропустил. Спасибо всем заранее!

+2

Вы не можете отличить суперкласс к подклассу. –

ответ

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 
} 
+0

Огромное спасибо за ваше драгоценное предложение! Моя кулачная ошибка заключалась в том, что моя глупость забыла правила наследования java, давая всю вину JPA (это для меня все еще большая неясная технология), но, как вы мне показали, также была проблема с дизайном. –

4

Это способ, которым предназначена Java; вы не можете отличить суперкласс к подклассу только наоборот. Это не имеет никакого отношения к JPA.

+0

Я был так сконцентрирован на JPA, и netbeans не дает мне доказательств моей глупости, поэтому я вдруг подумал, что это проблема JPA! Простите!! –