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?
Entity
.Serializable
.ID
unique, immuableSinon, vous ne pouvez pas.
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...
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 !!!
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.