关于java:JPA实体没有主键吗?

您所在的位置:网站首页 jpa实体没有主键怎么办 关于java:JPA实体没有主键吗?

关于java:JPA实体没有主键吗?

2024-06-30 14:13| 来源: 网络整理| 查看: 265

我有一个实体类:

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

我收到以下错误:

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

我在网上阅读,发现实体必须定义一个主键。 但是我这里的表仅是一个行表。 它只是用来保存系统配置。

因此,我唯一想做的查询将是检查该行是否存在,然后获取该行并进行更新。

我的列是serverIp,端口,服务器名称。

我应该如何删除该错误?

相关讨论 我的答案被接受了吗?

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

在Oracle中,您可以将ROWID列用于任何表。

像这样:

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

希望能帮助到你...

相关讨论 非常感谢您的回答。 它挽救了我的一天 您如何填充它? @Steve ROWID是Oracle自动生成的内部密钥。 如果我们从视图中进行选择,则不适用。请建议我们如何使用视图 在这种情况下,您需要首先在视图选择中包括其中一个表的rowid,条件是对于该记录,该rowid在视图结果中仍然是唯一的。

JPA 2.0 Specification

实体类必须使用Entity注释进行注释。 实体类必须具有no-arg构造函数。 实体类不能是最终的 实体类必须实现Serializable接口。 实体类必须具有唯一的,不变的ID

否则,您将无法。

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

123456789101112131415@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选择]的问题:

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

保重并开心!!!

相关讨论 不得不做同样的事情,但就我而言,我映射到数据库视图,甚至没有合并的PK或UK。

另一种方式是指定该类本身可以用作@IdClass的唯一标识符。因此,在这种情况下,只需使用@IdClass(CmcMapServerInfo.class)注释该类,并且该类应独立于基础数据库。

您可以将applicationName或ip地址标记为主键(尽管不会自动生成)。即使这些列都没有在数据库中声明为主键也没关系。

相关讨论 您的意思是在我的Entity.java中,我在该列上方写入@Id,并且不更改数据库配置? ip地址不断变化,因此无法保持 是的,您可以将其放在applicationName上 这是行不通的。 如果您将具有相同字段值的记录标记为id,则您的结果集可能包含两次相同的记录。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3