web-dev-qa-db-ja.com

JPAエンティティに主キーはありませんか?

私はエンティティクラスがあります:

@Entity
@Table(name="CMC_MAP_SERVER_INFO")
@NamedQuery(name="CmcMapServerInfo.getMapServer", query="SELECT c FROM CmcMapServerInfo c")
public class CmcMapServerInfo implements Serializable {
    private static final long serialVersionUID = 1L;

    @Column(name="APPLICATION_NAME")
    private String applicationName;

    private String remarks;

    @Column(name="SERVER_IP")
    private String serverIp;

    @Column(name="SERVER_NAME")
    private String serverName;

    @Column(name="SERVER_PORT")
    private short serverPort;

    public CmcMapServerInfo() {
    }

次のエラーが発生します。

Entity class [class cdot.oss.cmsat.conf.ejb.entity.CmcMapServerInfo] has no primary key specified.

オンラインで読んだところ、エンティティには主キーが定義されている必要があることがわかりました。しかし、ここでの私のテーブルは1行のテーブルのみです。システム構成を保存するためだけに使用されました。

そのため、行が存在するかどうかを確認し、その行を取得して更新することだけが、クエリで行います。

私の列はserverIp、ポート、サーバーの名前です。

このエラーを削除するにはどうすればよいですか?

14

PKなしのメッセージでこの問題も発生しました。

Oracleでは、どのテーブルにも常に存在するROWID列を使用できます。

このような:

@Id
@Column(name="ROWID")
String rowid;

それが役に立てば幸い...

JPA 2.0 Specification

  • エンティティクラスには、Entityアノテーションを付ける必要があります。
  • エンティティークラスには引数のないコンストラクターが必要です。
  • エンティティークラスは最終であってはなりません
  • エンティティークラスはSerializableインターフェースを実装する必要があります。
  • エンティティクラスには、一意で不変のIDが必要です

それ以外の場合はできません。

20
Zaw Than oo

データベース内のすべてのエンティティオブジェクトは一意に識別されます。主キーなしでテーブルを表す別の方法は、すべての列を使用して複合主キーを使用すること、またはそれらのいくつかは候補キーを表すことです。

@Entity
public class TableWithoutId {
    @EmbeddedId EmbeddableTableWithoutId id;

    /* Getters an Setters... */

    //Here you can implement @Transient delegates to the Getters an Setters of "id".
}

@Embeddable
Class EmbeddableTableWithoutId {
    int columnA;
    long columnB;
    /* Getters an Setters... */
}

[Select By Id]で問題が発生する可能性があります。

entityManager.find(TableWithoutId.class, id);//it can throws NonUniqueResultException or anything like that...

気を付けて、幸せになってください!!!

6
Rafael Quintino

ApplicationNameまたはIPアドレスを主キーとしてマークできます(自動生成されません)。これらの列のどちらもデータベースで主キーとして宣言されていなくても問題ありません。

0
6ton

別の方法は、クラス自体を@IdClassで一意の識別子として使用できるように指定することです。したがって、この場合は、@ IdClass(CmcMapServerInfo.class)でクラスに注釈を付けるだけで、基礎となるデータベースから独立している必要があります。

0
Ducane