关于java:JPA实体没有主键吗? |
您所在的位置:网站首页 › jpa实体没有主键怎么办 › 关于java:JPA实体没有主键吗? |
我有一个实体类: 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 |