Java JPA实体没有主键?

Java JPA实体没有主键?,java,database,jpa,entity,ejb-3.0,Java,Database,Jpa,Entity,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 = 1

我有一个实体类:

@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.
我在网上阅读并发现实体必须定义主键。 但是我这里的桌子只有一排。它只是用来保存系统配置

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

我的列是服务器IP、端口、服务器名称


如何继续删除此错误?

您可以将应用程序名或ip地址标记为主键(尽管不是自动生成的)。即使这两列都未声明为数据库中的主键,也没有问题。

  • 实体类必须用
    实体
    注释进行注释
  • 实体类必须具有无参数构造函数
  • 实体类不能是final
  • 实体类必须实现可序列化的接口
  • 实体类必须具有唯一的、不可变的
    ID

否则,您不能。

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

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

保重,快乐

我在没有PK的消息中也遇到了这个问题

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

像这样:

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

希望它有帮助…

另一种方法是指定类本身可以用作@IdClass的唯一标识符。因此,在本例中,只需使用@IdClass(CmcMapServerInfo.class)注释该类,它应该独立于底层数据库。

您的意思是在my Entity.java中,我在列上方写“@Id”,而不更改数据库配置?Ip地址不断变化,因此无法保持不变是的,您可以将其放在应用程序名上,否则将无法工作。如果您将具有相同字段值的记录标记为id,则您的结果集可能会包含相同的记录两次。非常感谢您的回答。它保存了我的一天。您是如何填充它的?@Steve ROWID是Oracle自动生成的内部键。如果我们从视图中选择,则此项不适用。请建议我们如何使用视图。在这种情况下,您需要首先在视图选择中包括其中一个表的ROWID,前提是,对于该记录,rowid在视图结果中仍然是唯一的。我必须这样做,但在我的情况下,我映射到了一个db视图,甚至没有组合的PK或UK…我的答案被接受了吗?