0

OracleとJPAを使用してdbスキーマを構築しようとしています。私はJPAを初めて使用しますが、常にsqlを直接使用していました。私が作成する必要があるのは2つのテーブルです。1つは現在のVOIP呼び出しを含み、もう1つはそれらの呼び出しの履歴を含みます。2つのテーブルは同一です。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 {
...

ご覧のとおり、2番目のテーブルには他のフィールドはありませんが、最初のテーブルを拡張したものです。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 に答える