我有一个实体类:
@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,port,服务器名称。
我应该如何继续删除此错误?
答案 0 :(得分:20)
Entity
注释进行注释。Serializable
接口。ID
否则,你不能。
答案 1 :(得分:19)
我遇到了这个问题以及没有PK的消息。
在Oracle中,您可以使用任何表格的ROWID列。
像这样:
@Id
@Column(name="ROWID")
String rowid;
希望它有所帮助...
答案 2 :(得分:5)
数据库中的每个实体对象都是唯一标识的。 表示没有主键的表的另一种方法是使用复合主键使用其所有列,或者其中一些表示候选键:
@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... */
}
也许您会遇到[按ID选择]的问题:
entityManager.find(TableWithoutId.class, id);//it can throws NonUniqueResultException or anything like that...
小心,快乐!!!
答案 3 :(得分:0)
您可以将applicationName或IP地址标记为主键(尽管不是自动生成的)。即使这些列都没有被声明为数据库中的主键,也没关系。
答案 4 :(得分:0)
另一种方法是指定类本身可以用作@IdClass的唯一标识符。因此,在这种情况下,只需使用@IdClass(CmcMapServerInfo.class)注释该类,它就应该独立于基础数据库。