有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在db中创建空对象或稍后保存

我的数据库中有下表:

CREATE TABLE document (
  id INT PRIMARY KEY AUTOINCREMENT,
  productModelId INT NOT NULL,
  comment VARCHAR(50),
  CONSTRAINT FK_product_model FOREIGN KEY (productModelId) REFERENCES product_model(id),
)

当然,实表要复杂得多,但这足以理解问题

我们的用户希望在单击“新建”按钮时看到文档的编号。所以,为了做到这一点,我们必须在db中创建对象并将该对象发送给客户机。但是,有一个问题。在将对象保存到db中之前,我们需要知道productModelId。否则我们将有一个sql异常

我看到了两种可能的变体(都很难看,真的):

  1. 向用户显示带有产品模型的模式列表,然后使用用户选择的productModelId在数据库中创建对象

  2. 创建一个临时编号,然后在用户完成编辑文档并保存id时将对象保存在db中。我们还需要删除NOTNULL大小写并在代码中验证此somwhere

第一种方法不好,因为我们的应用程序中有太多模态。我们的用户界面太重了

第二种变体很难看,因为如果没有所有的检查,我们的数据库是不一致的

你能建议我们做什么?有新的解决方案吗?你在应用程序中做什么?可能是一些UI提示。我们目前正在使用第一种变体


共 (2) 个答案

  1. # 1 楼答案

    我们是这样做的

    创建了带有issue_type_id和lastId字段的表id_请求。我们需要这样做,以避免两个用户点击“新建”按钮并获得相同ID的情况

    当然,我们在所有使用此功能的表中添加了字段innerNum

    谢谢!

  2. # 2 楼答案

    理论上说,你在数据库中使用的id不应该是相关信息,因此,如果没有很好地隐藏在URL或类似文件中,用户就不应该看到它,因此你不应该向用户显示它,而你遇到的问题可能是证实了这一理论

    目前,您的解决方案部分是正确的:它满足技术要求,但仍然不好,因为如果用户不完成插入,您将最终导致数据库有空记录(意思是,ID和外键正常,但所有其他字段都为空或具有无用的默认值),因此,您基本上绕过了数据库验证

    有两种更好的解决方案,但都需要您检查数据库

    第一个是不要将id用作向用户显示的内容。使用另一列和另一个“id”,在数据库中声明它是唯一的,在应用程序中生成它,向用户显示它,然后在需要的地方使用另一个“id”(如果它是唯一的,它实际上是一个id)

    第二个是经常使用的,因为它不需要中央数据库或其他机构来检查ID的唯一性,因此在分布式环境中可以更好地扩展

    不管是否使用常用的“id int”自动递增,都不要使用UUID。您的id将是varchar或二进制,UUID实现(如java.util.UUID,但您可以在其他语言中找到)将在您需要时(以及在任何地方,甚至在客户端上)自行生成唯一的id,然后在保存时提供该id