16

アプリケーションで JPA を使用しています。テーブルの 1 つで、主キーを使用していません (設計が悪いことはわかっています)。

生成されたエンティティは次のようになります。

@Entity
@Table(name="INTI_SCHEME_TOKEN")
public class IntiSchemeToken implements Serializable {
    private static final long serialVersionUID = 1L;

    @Column(name="CREATED_BY")
    private String createdBy;

    @Temporal( TemporalType.DATE)
    @Column(name="CREATED_ON")
    private Date createdOn;

    @Column(name="SCH_ID")
    private BigDecimal schId;

    @Column(name="TOKEN_ID")
    private BigDecimal tokenId;

    public IntiSchemeToken() {
    }

    public String getCreatedBy() {
        return this.createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public Date getCreatedOn() {
        return this.createdOn;
    }

    public void setCreatedOn(Date createdOn) {
        this.createdOn = createdOn;
    }

    public BigDecimal getSchId() {
        return this.schId;
    }

    public void setSchId(BigDecimal schId) {
        this.schId = schId;
    }

    public BigDecimal getTokenId() {
        return this.tokenId;
    }

    public void setTokenId(BigDecimal tokenId) {
        this.tokenId = tokenId;
    }



} 

ここで私のプロジェクトでは、Eclipse IDEはこのクラスにエラーマーク(赤い十字)を表示し、エラーは「エンティティには主キー属性が定義されていません」です。

主キーなしでエンティティを作成する方法を教えてもらえますか?

ありがとう。

4

8 に答える 8

21

できません。エンティティは、一意の不変のIDを持っている必要があります。データベースで主キーとして定義する必要はありませんが、フィールドまたはフィールドのセットは行を一意に識別する必要があり、その値は変更されない場合があります。

したがって、エンティティ内の1つのフィールド、またはエンティティ内の1セットのフィールドがこれらの基準を満たしている場合は、それをエンティティのIDにします。たとえば、ユーザーが同じ日に2つのインスタンスを作成する方法がない場合は、[createdOn、createdBy]をエンティティのIDにすることができます。

もちろん、これは悪い解決策であり、スキーマを実際に変更して、自動生成された単一列のIDをエンティティに追加する必要があります。

于 2012-11-02T07:44:04.273 に答える
8

プライマリ キー (PK) がエンティティ クラスに継承されるマネージド スーパー クラスである場合は、マップされたスーパー クラス名を persistence.xml ファイルに含める必要があります。

バグレポートを見てください: https://bugs.eclipse.org/bugs/show_bug.cgi?id=361042

于 2015-05-03T09:08:22.327 に答える
6

主キーのないクラスを定義する必要がある場合は、そのクラスを埋め込み可能クラスとしてマークする必要があります。それ以外の場合は、定義しているすべてのエンティティの主キーを指定する必要があります。

于 2012-11-03T03:28:50.177 に答える
4

追加された検証をオフ (変更) できます。

ワークスペース設定の「Java Persistence->JPA->Errors/Warnings」の「Type」に移動し、「Entity has no primary key」を「Warnning」に変更します。

于 2015-05-05T06:54:05.303 に答える
0

Hibernate を使用しない別のソリューション

テーブルに PK がない場合 - PK である可能性のある列の論理的な組み合わせがあります (何らかの種類の行 ID を使用できる場合は必要ありません) - ただし、一部の列は NULL 可能であるため、実際にはできませんDB の制限により PK を作成します。また、テーブル構造を変更することはできません (レガシー コードで列が明示的にリストされていない場合、insert/select ステートメントが壊れます)。

次に、次のトリックを試すことができます - 連結された論理キー列 ('A='||a||'B='||'C='c..) または行 ID の値を持つ仮想列を持つデータベースでビューを作成します -このビューで JPA エンティティ クラスを作成します - @Id アノテーションで仮想列をマークします

それでおしまい。データの更新/削除操作も可能ですが (挿入ではありません)、仮想キー列が行 ID で構成されていない場合は使用しません (DB テーブルによるフルスキャン検索を避けるため)。

PS同じアイデアが、リンクされた質問で部分的に説明されています。

于 2014-10-24T12:24:33.820 に答える
0

主キーを作成する必要があります。適切なフィールドが見つからない場合は、自動インクリメント ID を作成します。

CREATE TABLE fin_home_loan (
  ID int NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (ID));
于 2015-12-02T19:32:54.797 に答える