java - 如何检查对象是否已保存到数据库

标签 java jdbc spring-jdbc

我正在使用 Spring JDBC,我想创建一个方法来检查它是否已保存到数据库中,这意味着它将获得一个自动递增的 key 。

我有一个名为 id 的 int 类型字段。由于如果没有给出其他值,原始整数会自动分配 0,因此我可以创建一个方法来检查 id == 0 是否为 0,但随后我必须确保我的主键序列从 1 开始。

我还可以在存储库中创建一个方法来检查对象是否已保存,但我不想为此进行查询。

我能想到的最后一个选择是将id的类型更改为Integer,然后检查它是否为null,但我不知道这是否是一个好方法。

有没有办法在域层中有一个方法来做到这一点?

最佳答案

id 的类型从 int 更改为 Integer 被认为是一个好主意:持久性框架,例如 Hibernate JPA 鼓励这样做(请参阅 java.net 中的这个示例和 adam-bien.com 中的这个示例)。

使用对象类型,您只需检查是否 id == null 即可快速区分未持久化的对象和持久化的对象。只是为了完整性:

  • id == null:未保存的对象,执行INSERT
  • id != null:对象已保存,执行UPDATE

这样,您就不必将 0(或任何其他整数值)视为表示未初始化的特殊情况;您已经有了 null,它很好地传达了特殊情况的想法。

添加业务 key

this article 中建议的更好的方法,就是除了数据库管理的 ID 之外还使用业务 key 。业务 key 是一个实体标识符,与自动生成的主键(代理键)不同,它对用户具有一定的意义(自然键)。

然后,您应该重写 equals 方法,以使用业务键而不是自动生成的主键来比较两个对象。

关于java - 如何检查对象是否已保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15534634/

相关文章:

java - 如何使用 Spring Data Solr 实现多核和存储库的自定义 Solr 存储库

javascript - 内联 javascript 验证不适用于 jsp 文件

java - 文件输入流创建

java - JDBC 库在 Android Studio 中不工作

java - 不支持游标类型/并发组合

java - 即使在日志中看到 "adding transactional method",事务顾问也不会拦截方法

java - 摩尔斯电码,从英语到摩尔斯电码

java - 为什么语句有效但 java、jdbc、oracle 中的准备语句无效?

spring - 通过 SSL 连接 Informix JDBC

java - SQL 的未分类 SQLException