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异常
我看到了两种可能的变体(都很难看,真的):
你能建议我们做什么?有新的解决方案吗?你在应用程序中做什么?可能是一些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 谢谢大家!