Hibernate 记录尚未保存,但数据库中自动递增的id已递增
我有两个表来存储答案和表单的HTML模板。表answers具有外键,外键指html_模板表中的主键。当我尝试向应答表添加记录时出现问题Hibernate 记录尚未保存,但数据库中自动递增的id已递增,hibernate,Hibernate,我有两个表来存储答案和表单的HTML模板。表answers具有外键,外键指html_模板表中的主键。当我尝试向应答表添加记录时出现问题 //session opened Answers answers = new Answers(); answers.setAnswer("answer..."); //there is a record in getHtmlTemplates with 4 as an id answers.setHtmlTemplates(get
//session opened
Answers answers = new Answers();
answers.setAnswer("answer...");
//there is a record in getHtmlTemplates with 4 as an id
answers.setHtmlTemplates(getHtmlTemplates(4));
session.save(answers);
程序执行时没有任何警告,但在DB(MySql)中没有记录。当我手动将记录添加到
答案
时,id会增加一个以上。实际上,当所有操作都在事务中时,会添加一条记录。怎么搞的?DB数据库似乎已删除此记录 您可能没有提交事务。对于MySQL使用的自动递增列,save
方法会插入一个伪记录,以便Hibernate可以检索新的ID值(注意,save
返回一个对象,即新ID)。MySQL现在已经将该值标记为正在使用,这就是为什么当您手动插入时,ID看起来像是“跳转”了。很可能您没有提交事务。对于MySQL使用的自动递增列,save
方法会插入一个伪记录,以便Hibernate可以检索新的ID值(注意,save
返回一个对象,即新ID)。MySQL现在已经将该值标记为正在使用,这就是为什么当您手动插入时,ID看起来像“跳转”了。您可能是对的。但我在考虑我甚至没有开始任何交易的情况。我只打开了一个会话并在会话中保存了一个新对象,然后调用了session.flush()。没用。正如我在使用transaction时所说的,所有事务都有效,但我需要启动事务吗?它以这种方式处理没有外键的表,因此当可能有多个SQL查询执行(从数据库中检索对象的主键)时,必须启动(并提交)事务?Hibernate在事务中执行所有操作。在上面的示例中,事务是隐式启动的,但您从未提交它,因此没有数据。您可能是对的。但我在考虑我甚至没有开始任何交易的情况。我只打开了一个会话并在会话中保存了一个新对象,然后调用了session.flush()。没用。正如我在使用transaction时所说的,所有事务都有效,但我需要启动事务吗?它以这种方式处理没有外键的表,因此当可能有多个SQL查询执行(从数据库中检索对象的主键)时,必须启动(并提交)事务?Hibernate在事务中执行所有操作。在上面的示例中,事务是隐式启动的,但您从不提交它,因此没有数据。