16

コーディングの労力と重複を減らすために、一連のエンティティの基本クラスを作成しようとしています。私の考えでは、基本クラスには共通のメタデータフィールドがあり、子クラスは固有の属性を処理します。

私の基本クラス:

@MappedSuperclass
public abstract class FinanceEntityBean {
    protected Long id;

    @Version
    private long version;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

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

最初のエンティティ:

@Entity
@Table(name = "tag")
public class Tag extends FinanceEntityBean {
}

このコードを使用してTagエンティティでCRUD関数を実行するテストを作成しましたが、すべて正常に機能しています。

私の質問は-なぜEclipse(Indigo)Tagがエラーがあると主張するのですか?

The entity has no primary key attribute defined

私は今のところそれを警告に変更してコードをコンパイルしますが、なぜEclipseが満足していないのか、そして何かを誤解したのかどうか興味があります。

これは有効なJPA2.0コードですか?Hibernate4.1.5は私のJPAプロバイダーです。

4

5 に答える 5

9

混合アクセスを使用する場合は、アクセスタイプを指定する必要があります。フィールドとプロパティの両方に注釈が付けられている場合に検証エラーを改善するには、 EclipseDaliのバグ323527を参照してください。

オプション1:代わりにgetVersion()メソッドに注釈を付けます。プロパティのみに注釈が付けられます。
オプション2:混合アクセスタイプを次のように指定します。

@MappedSuperclass
@Access(AccessType.PROPERTY)
public abstract class FinanceEntityBean {
    protected Long id;

    @Version
    @Access(AccessType.FIELD)
    private long version;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    public void setId(final Long id) {
        this.id = id;
    }
}
于 2012-08-29T17:35:57.857 に答える
7

FinanceEntityBeanとは別のEclipseプロジェクトで定義されている場合はTag、Daliのバグ 「他のプラグインプロジェクトに主キー属性がありません」に悩まされている可能性があります。

回避策は、に関連付けられFinanceEntityBeanたファイルにリストすることです。persistence.xmlTag

于 2012-08-27T21:56:59.630 に答える
3

私はそれらが有効なマッピングであるとかなり確信しています。

JPA 2.0仕様は、MappedSuperClasses(セクション2.11.2)について話すときにこの例を提供します。

@MappedSuperclass 
public class Employee {
    @Id protected Integer empId; 
    @Version protected Integer version; 
    @ManyToOne @JoinColumn(name="ADDR") protected Address address;
    public Integer getEmpId() { ... } 
    public void setEmpId(Integer id) { ... } 
    public Address getAddress() { ... } 
    public void setAddress(Address addr) { ... }
}

// Default table is FTEMPLOYEE table 
@Entity public class FTEmployee extends Employee {
    // Inherited empId field mapped to FTEMPLOYEE.EMPID 
    // Inherited version field mapped to FTEMPLOYEE.VERSION 
    // Inherited address field mapped to FTEMPLOYEE.ADDR fk
    // Defaults to FTEMPLOYEE.SALARY protected Integer salary;
    public FTEmployee() {}
    public Integer getSalary() { ... } 
    public void setSalary(Integer salary) { ... }
}
于 2012-08-27T01:34:39.627 に答える
2

同じ問題がありましたが、理由は異なりますが、気づきませんでした。さらなる調査で、私の場合、別の瓶にMappedSuperclassがあることがわかりました。ユーザーガスによるとhttps://stackoverflow.com/users/3701228/gas

「JPA仕様によると、別のjarにjpaクラスがある場合は、persistence.xmlに追加する必要があります(Hibernateで必要かどうかはわかりませんが、試してみてください)。次のエントリをに追加してみてください。あなたのpersistence.xmlentity.jar」

は、Webアプリのjpapersistence.xmlでjarファイルを参照するための正しいパスを参照していますか?これを行う方法の説明として。

于 2016-06-28T19:02:48.900 に答える
1

これが遅いことは知っていますが、それでも問題です。質問へのコメントで@Kemodaに感謝します。これは、Eclipse設定でオフにすることができます。

これを「修正」する最も簡単な方法は、環境に適していると思われる設定を設定することです。エンティティに主キーがない場合はエラーが発生するため、「警告」が好きです。

JPAエラー/警告タイプエンティティには主キーがありません:[エラー|警告|情報|無視]

于 2020-01-31T21:46:35.703 に答える