2017-01-17 2 views
2

トップレベルの親がプライマリキー(@Id)を定義する4つの継承レベルから継承するエンティティクラスがあります。エンティティクラスにプライマリキーが指定されていない

エンティティクラス[クラスD]に主キーが指定されていません。 @Id、@EmbeddedId、または@IdClassのいずれかを定義する必要があります。これらの注釈のいずれかを使用してPKを定義した場合は、エンティティクラス階層に混合型のアクセスタイプ(注釈付きのフィールドとプロパティの両方)がないことを確認してください。ここで

は階層です:

A-> B-> C - >(エンティティ)D

これはその子に値を与え、私の非エンティティクラスです:

import javax.persistence.*; 
import java.io.Serializable; 
import java.util.Date; 

@MappedSuperclass 
public class A implements Serializable { 
@Id 
@GeneratedValue 
protected Long id; 
@Temporal(javax.persistence.TemporalType.TIMESTAMP) 
protected Date deleted; 

public Date getDeleted() { 
    return deleted; 
} 

public void setDeleted(Date deleted) { 
    this.deleted = deleted; 
} 

public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 
} 

これはその子のいずれかです。

@MappedSuperclass 
public abstract class B extends A implements Serializable { 

} 

B->C 

import javax.persistence.Entity; 
import javax.persistence.Transient; 


@MappedSuperclass 
public class C extends B{ 

protected String name; 
protected String description; 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 
} 

そして最後にC->(エンティティ)D

@Entity 
public class D extends C{ 
private String codeD; 

public String getCodeD(){return codeD;} 
public String setCodeD(String codeD) {this.codeD = codeD;} 
} 

通常、@MappedSuperclassを使用してシリアライズ可能なものを実装すれば、それはうまくいくはずです。私は階層のすべてのステップでもSerializableを実装しようとしましたが、同じエラーメッセージが表示されました。

私は現在Payara 4.1.1.1621を使用しています。いくつかのスレッドでこのような種類のエラーが発生しているように見えるかもしれませんが、すべてが奇妙な問題を解決しているかどうかはわかりません。

+0

エンティティは問題ありません。あなたのJPAプロバイダは問題を抱えているようですが、どちらですか? –

+0

投稿したマッピングはOKと思われます。実際、単純なアプリで再現しようとしましたが、Payara Server 162で動作します。ORM XMLマッピングファイルは使用していますか?問題を引き起こす可能性のある追加のマッピングが含まれている可能性はありますか? – OndrejM

+0

JPAプロバイダがEclipseLinkで、javax.persistenceバージョンのEclipseLinkが2.1.0 ORM XMLマッピングファイルを使用していません。 –

答えて

0

設定は、仕様が示唆しているようです。追加することができます私の心に来る

唯一のことは、明示的にデータベースのカラム名を宣言するために@Columnアノテーションです:

@Id 
@GeneratedValue 
@Column(name = "id") 
protected Long id; 
@Temporal(javax.persistence.TemporalType.TIMESTAMP) 
@Column(name = "deleted") 
protected Date deleted; 

はそれを試してみてください。それでも動作しない場合は、@MappedSuperClassとしてマークされたクラスのすべてのフィールドに注釈を付けるようにしてください。

また、クラスCのフィールドには保護されていないプライベートではないとマークされている必要がありますか?

+0

あなたの答えをありがとうが、それはうまくいかなかった。クラスCのフィールドにprivateの代わりにprotectedとマークされました。ありがとう –

関連する問題