当前位置: 首页 > 知识库问答 >
问题:

如何使用带有触发器的表从Spring JPA save获取更新值

殷耀
2023-03-14

我遇到的问题是,当我使用Spring JPA持久化到带有触发器的表时。如果某个字段在插入时为NULL,则触发器将使用默认值填充该字段。

CREATE TABLE Example (
    ID INTEGER IDENTITY PRIMARY KEY,
    col int
);

CREATE TRIGGER PUBLIC.TR_INSERT BEFORE INSERT ON PUBLIC.Example
    REFERENCING new ROW AS newrow FOR EACH ROW
BEGIN ATOMIC
  IF newrow.col is null THEN
  SET newrow.col = 1;
  END IF;
END

我的测试失败了,因为实体中的值仍然为NULL,而不是触发器中的更新值。我猜除了ID之外,保存不期望任何值发生变化。

@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
@Entity
@Table(name = "example")
public class Example {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(name = "col")
  private Integer col;
}
public interface ExampleRepository extends JpaRepository<Example, Long> {
}

@Transactional
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class ExampleRepositoryIntTest {
  @Autowired
  ExampleRepository uut;

  @Test
  public void testNullIsChangedToDefault() {
    Example ex = Example.builder().col(null).build();
    Example saved_ex = uut.save(ex);
    assertEquals("1", saved.getCol()); // <-- Fails...returned value is "null"
  }
}

我已经能够使用JdbcTemplate正确地持久化数据,但这似乎是一种倒退。

我使用的是SpringBoot 2.4.5 libs和HSqlDB 2.6

共有1个答案

贺君浩
2023-03-14

找到了我问题的答案

保存后刷新并获取实体(JPA/Spring Data/Hibernate)

简短的回答是,一旦您保存,您需要从数据库中获取更新的值。JPA缓存选择请求,这样它就不会进入数据库。调用entityManager.refresh()就可以了。

 类似资料:
  • 问题内容: 如何在SQL触发器中获取更新的记录的值-像这样: 显然这是行不通的,但是您可以看到我要尝试的内容。 问题答案: 如果您 确定 只会更新一个值,则可以执行此操作… 如果可以一次更新多个值,则此代码将仅处理其中一个。(尽管不会出错。) 您可以使用游标,或者如果它是SQL Server 2008+,则可以使用表变量。 或者,更常见的是,只需将StoredProcedure代码移到触发器中。

  • userNotesTable: 用户提醒表: 插入触发器: 更新触发器: 这是数据库的当前代码,以及提醒表的特定触发器。我遇到的困难是,从提醒表中的specific中的user notes表中选择特定的名称和额外的内容,所有这些都在更新触发器中。 插入时,和会被插入到提醒和搜索表中,但我希望能够使用特定名称和用户注释表中的额外内容更新搜索表,这可能吗?

  • 我有要求,我需要获取在特定持续时间后更新或添加的所有blob存储。 示例:-在容器中,我将zip文件列表作为blob,我需要在给定的时间间隔内获取所有更新或新添加的blob,例如每隔1小时我需要获取所有新添加或更新的blob。 所以我使用了azure函数,其中创建了一次触发函数,但无法获取所有blob(更新或新添加)。 谁能告诉我如何解决这个问题。 作用json文件 ],“禁用”:false }

  • 问题内容: 有没有一种方法实际上可以获取已更新的列名,以便在触发器中使用它? 基本上,我试图在用户插入或更新表时进行审核跟踪(在这种情况下,它与Contact表有关) 如何获取已更新的列的名称,并从中获取该列的和值。如果一行中甚至多行中更新了多列,是否可以对每次更新进行审核? 问题答案: 只需对每列使用OLD.colname <> NEW.colname即可检查并查找不同的列。触发器在MySQL中

  • 我对机会产品(i.e.line项)使用存储在Opp本身中的opp术语进行计算(例如:OLI. RecurringAmt=OPP. Term*OLI. UniPRICE*OLI. QUANTITY) 如果Opp中的术语(整数)的值发生变化,则需要手动更新每个OLI中的数学值。我建议在Opp上使用触发器,以便在术语更改时进行此更新。 问题是:由于Opp中的金额字段由SFDC自动计算为每个相关行项目的单

  • 问题内容: 我想从Oracle数据库架构中检索所有触发器名称。 我使用getFunctions检索所有函数,但找不到触发器的另一个函数。 问题答案: 您可以使用元数据来做到这一点。