Java 在数据库中创建空对象或稍后保存

Java 在数据库中创建空对象或稍后保存,java,mysql,database,spring,user-interface,Java,Mysql,Database,Spring,User Interface,我的数据库中有下表: 创建表文档( id INT主键自动递增, productModelId INT不为空, 评论VARCHAR(50), 约束FK_product_model外键(productModelId)引用product_model(id), ) 当然,实表要复杂得多,但这足以理解问题 我们的用户希望在单击“新建”按钮时看到文档的编号。所以,为了做到这一点,我们必须在db中创建对象并将该对象发送给客户机。但是,有一个问题。在将对象保存到db中之前,我们需要知道productModel

我的数据库中有下表:

创建表文档(
id INT主键自动递增,
productModelId INT不为空,
评论VARCHAR(50),
约束FK_product_model外键(productModelId)引用product_model(id),
)
当然,实表要复杂得多,但这足以理解问题

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

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

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

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

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

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


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

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

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

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

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

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


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

    我们采用以下方法

    已创建表id\u请求,其中包含issue\u type\u id和lastId字段。我们需要这样做是为了避免两个用户点击“新建”按钮并获得相同ID的情况

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

    谢谢大家!