可以将@Id添加到映射到Spring boot Jpa中没有主键列的表的实体吗?

Posted

技术标签:

【中文标题】可以将@Id添加到映射到Spring boot Jpa中没有主键列的表的实体吗?【英文标题】:Is it OK to add @Id to an entity which mapped to a table without Primary key column in Spring boot Jpa? 【发布时间】:2021-09-25 00:14:58 【问题描述】:

我已经开始使用旧版 oracle 数据库并使用 Spring boot Jpa 尝试在没有身份的表 (CHANNELMGR_REQUEST) 中插入新行:

此表有一个数字列 (CM_ISN),逻辑上可能是身份候选者,但由于某种原因我无法访问数据库。

我还发现了一个现有序列 (CHANNELMGR_SEQ),它也用于为该 CM_ISN 列生成值。

所以我决定使用该序列并在我的等效 POJO 中添加一些注释,如下所示,并将序列映射到 CM_ISN 列。但不接触数据库:

我的仓库是这样的:

在插入行时,成功调用序列但得到如下异常:

我的问题:

    修改实体并将@Id添加到不在等效表中的实体是错误的吗? 我收到错误的代码有什么问题?

PS:很抱歉放了图片而不是实际的源代码,原因是开发机器无法访问互联网。

【问题讨论】:

【参考方案1】:
    如果不是主键就错了 使用 BigDecimal 代替 Number

【讨论】:

BigDecimal 解决了这个问题。为什么第一个问题是错误的?你有什么建议? 通过使用@Id,您依赖于列是唯一的,即使它在逻辑上是唯一且非空的,数据库也不会强制执行。当插入不符合注释要求的数据时,这可能会导致非常意外的结果。

以上是关于可以将@Id添加到映射到Spring boot Jpa中没有主键列的表的实体吗?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot JPA:将一个实体映射到具有相同列的多个(很多)表

使用 Spring Boot 和 Thymeleaf 将复选框映射到列表

如何将Spring Boot RepositoryRestResource映射到特定的URL

如何将 Spring Boot @RepositoryRestResource 映射到特定的 url?

Java Spring Boot将rest api映射到模型[重复]

如何使用spring boot将json映射到对象[重复]