У объекта JPA нет первичного ключа?

У меня есть класс Entity:

@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.

Я читал онлайн и выяснял, что сущности должны иметь первичный ключ. Но моя таблица здесь только одна таблица строк. Он просто использовался для сохранения конфигурации системы.

Таким образом, только запросы, которые мне понравятся, это проверить, существует ли строка, затем получить эту строку и обновить ее.

Мои столбцы serverIp, порт, имя сервера.

Как мне удалить эту ошибку?

Ответ 1

У меня тоже была проблема с сообщением без ПК.

В Oracle вы можете использовать столбец ROWID, который всегда существует для любой таблицы.

Вот так:

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

Надеюсь, что это поможет...

Ответ 2

JPA 2.0 Specification

  • Класс сущности должен быть аннотирован аннотацией Entity.
  • Класс Entity должен иметь конструктор no-arg.
  • Класс сущности не должен быть окончательным
  • Класс Entity должен реализовывать интерфейсы Serializable.
  • Класс Entity должен иметь уникальный, неизменный ID

В противном случае вы не можете.

Ответ 3

Каждый объект объекта в базе данных уникально идентифицирован. Альтернативный способ представления таблицы без первичного ключа - использовать составной первичный ключ, используя все его столбцы, или некоторые из них представляют собой ключ-кандидат:

@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...

Позаботьтесь и будьте счастливы!!!

Ответ 4

Вы можете пометить имя приложения или IP-адрес как первичный ключ (хотя и не сгенерированный автоматически). Это нормально, даже если ни один из этих столбцов не объявлен как первичные ключи в базе данных.

Ответ 5

Другой способ - указать, что сам класс может использоваться как уникальный идентификатор с @IdClass. Так что в этом случае просто аннотируйте класс с помощью @IdClass (CmcMapServerInfo.class), и он должен быть независимым от базовой базы данных.