web-dev-qa-db-fra.com

L'entité JPA n'a pas de clé primaire?

J'ai une classe d'entité:

@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() {
    }

Je reçois l'erreur suivante:

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

J'ai lu en ligne et découvert que les entités doivent avoir une clé primaire définie . Mais ma table ici est une table à une seule ligne. C'est juste utilisé pour sauvegarder la configuration du système.

Donc, seules les requêtes que je voudrais faire seront pour vérifier si la ligne existe, puis obtenir cette ligne et la mettre à jour.

Mes colonnes sont serverIp, port, nom du serveur .

Comment dois-je procéder pour supprimer cette erreur?

11
Siddharth Trikha

JPA 2.0 Specification

  • La classe d'entité doit être annotée avec l'annotation Entity.
  • La classe d'entité doit avoir un constructeur no-arg.
  • La classe d'entité ne doit pas être finale
  • La classe d'entité doit implémenter les interfaces Serializable.
  • La classe d'entité doit avoir une ID unique, immuable

Sinon, vous ne pouvez pas.

20
Zaw Than oo

J'ai eu ce problème aussi avec un message sans PK. 

Dans Oracle, vous pouvez utiliser la colonne ROWID qui est toujours présente pour toutes les tables.

Comme ça:

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

J'espère que ça aide...

19

Chaque objet de la base de données est identifié de manière unique . Une autre façon de représenter une table sans clé primaire consiste à utiliser une clé primaire composite utilisant toutes ses colonnes, ou certaines d'entre elles représentant une clé candidate:

@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... */
}

Peut-être aurez-vous des problèmes avec [Select By Id]:

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

Prenez soin de vous et soyez heureux !!!

5
Rafael Quintino

Vous pouvez marquer le nom d'application ou l'adresse IP en tant que clé primaire (même si elle n'est pas générée automatiquement). C'est correct même si aucune de ces colonnes n'est déclarée comme clé primaire dans la base de données.

0
6ton