Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 插入/更新后如何更新对象_Sql_Hibernate_Jpa_Jpa 2.0 - Fatal编程技术网

Sql 插入/更新后如何更新对象

Sql 插入/更新后如何更新对象,sql,hibernate,jpa,jpa-2.0,Sql,Hibernate,Jpa,Jpa 2.0,我们为一些表提供了触发器,以便它们在每次put操作后更新插入/修改的实体 如何指示Hibernate在执行put()操作后立即读取实体,以便应用程序始终能够访问从DB读取的最准确数据(包括由触发器修改的数据)。 为了简单起见,假设在put()操作之后立即触发 我正在寻找像更新后选择或插入后选择这样的注释。 更好的解决方案是,如果我可以指定插入/更新后要读取的列 更新: @生成的注释在我的情况下不起作用,因为我正在对modifiedDate字段使用@ColumnTransformer注释,如上所述

我们为一些表提供了触发器,以便它们在每次put操作后更新插入/修改的实体

如何指示Hibernate在执行put()操作后立即读取实体,以便应用程序始终能够访问从DB读取的最准确数据(包括由触发器修改的数据)。 为了简单起见,假设在put()操作之后立即触发

我正在寻找像更新后选择或插入后选择这样的注释。 更好的解决方案是,如果我可以指定插入/更新后要读取的列

更新:

@生成的注释在我的情况下不起作用,因为我正在对modifiedDate字段使用@ColumnTransformer注释,如上所述

@生成在这里完全失败,因为它使Hibernate相信数据库会为它生成价值。因此,在insert/update过程中忽略在列上指定的自定义写入SQL


我希望从@Generated注释中重新加载功能,但在插入/更新过程中不忽略字段部分。

您正在寻找。

我认为这不可能在单个操作中完成。正如您所说,@Generated将忽略该列,@PostPersist和@PostUpdate无法调用EntityManager或查询(请参阅文档)

此外,如果您在同一事务中执行该操作,那么当您再次尝试加载数据时,什么可以保证触发器的执行完成


在我看来,唯一的解决办法是在另一个事务中保存或更新对象后刷新()。这种方法的唯一问题是,如果将此注释应用于基类的字段,Hibernate将发出与层次结构中实体数量相同的select命令。是否有可以在类级别指定的注释,以便一次性加载根对象下的所有对象?在这种情况下,一个大的select命令会更有效。这是一个很少使用的功能,已知效率很低(因为每次插入/更新都需要额外的select),我怀疑Hibernate是否已尽其所能对其进行优化。也就是说,我不明白为什么它会发出许多选择,而不仅仅是加载实体状态所需的选择。我刚刚测试过它。场景是:实体A具有实体B对象的列表。A和B都派生自基类。现在基类有一个字段modifiedDate,它由DB生成。当我执行put时,Hibernate为所有a和B对象生成insert命令。但是,它也会为每个实体生成一个select命令。因此,如果A有5个B对象,将生成6个select命令。如果只有一个选择来加载带有a的所有Bs(即使我们选择了a和B的所有字段),那么它的性能会更好。请注意,我所说的对象具有更大的层次结构。JB Nizet,我更新了我的问题@Generated为什么不适用于我的案例(即使我们将性能问题放在一边)。任何帮助都将不胜感激。谢谢!我不明白你的意思。您首先说这个值是由数据库生成的,现在您说它是由您的代码生成的。如果它是由代码生成的,则不需要刷新任何内容。无论如何,我不会对modifiedDate字段使用触发器。改用实体侦听器(PreInsert,PreUpdate JPA回调)。Julien,我在寻找一个注释,它完成@Generated的一半工作,即它只在插入/更新后读取指定字段的值,而不在插入/更新期间抑制其填充。在生成的情况下,Hibernate假设值纯粹由数据库生成,而不考虑用户可能已为此类字段指定了一些SQL,这些SQL将在数据库端执行以生成该字段的值。换言之,一些注释允许Hibernate在插入/更新期间编写自定义SQL,然后允许它读取相同的SQL。我知道你想要实现的是什么,@Generated肯定做不到,我同意。不幸的是,JPA/Hibernate似乎不提供这种功能,甚至通过限制PostPersist和PostUpdate的使用来禁止这种行为。