JPA实体没有主键?

Sid*_*kha 12 java database entity jpa ejb-3.0

我有一个实体类:

@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() {
    }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Entity class [class cdot.oss.cmsat.conf.ejb.entity.CmcMapServerInfo] has no primary key specified.
Run Code Online (Sandbox Code Playgroud)

我在线阅读并发现实体必须定义主键.但我这里的桌子只是一排桌子.它只是用来保存系统配置.

因此,我只想查询该行是否存在,然后获取该行并更新它.

我的列是serverIp,port,服务器的名称.

我该如何处理删除此错误?

Jos*_*rez 22

我有这个问题以及没有PK的消息.

在Oracle中,您可以使用ROWID列,该列始终存在于任何表中.

像这样:

@Id
@Column(name="ROWID")
String rowid;
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你...


Zaw*_* oo 20

JPA 2.0 Specification

  • 实体类必须使用注释进行Entity注释.
  • 实体类必须具有无参数构造函数.
  • 实体类不能是最终的
  • 实体类必须实现Serializable接口.
  • 实体类必须具有唯一的,不可变的 ID

否则,你不能.


小智 6

数据库中的每个实体对象都是唯一标识的.表示没有主键的表的另一种方法是使用复合主键使用其所有列,或者其中一些表示候选键:

@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... */
}
Run Code Online (Sandbox Code Playgroud)

也许你会遇到[按ID选择]的问题:

entityManager.find(TableWithoutId.class, id);//it can throws NonUniqueResultException or anything like that...
Run Code Online (Sandbox Code Playgroud)

保重,快乐!