gpt4 book ai didi

java - Spring Data Repository 保存未返回具有更新审核字段的实例

转载 作者:行者123 更新时间:2023-12-02 03:53:41 26 4
gpt4 key购买 nike

为什么repository.save(myEntity)不返回带有更新审核字段的更新实体?

来自 MyEntityRepository.save(myEntity) 以及随后来自 MyEntityService.save(myEntity) 的结果实例没有更新的 UpdatedOn 日期。我已经验证数据库中的设置正确,因此我知道审核正在工作。返回的实例的 updateOn 日期对于插入是正确的,但对于更新则不正确。我宁愿不必在每次保存后立即执行 findById,特别是如果意图是 save() 返回更新的附加实例。

假设updatedOn的设置是通过@PreUpdate钩子(Hook)进行的,并且该钩子(Hook)是在通过repository.save()调用entityManager.merge()期间触发的,我不明白为什么不会在返回的值上设置该值实例。

示例代码:

@Entity
@DynamicUpdate
@DynamicInsert
@Table(name = "my_entity", schema = "public")
@SequenceGenerator(name = "pk_sequence", sequenceName = "my_entity_seq", allocationSize = 1)
@AttributeOverrides({@AttributeOverride(name = "id", column = @Column(name = "id", columnDefinition = "int"))})
@EntityListeners(AuditingEntityListener.class)
public class MyEntity {

protected Integer id;

@LastModifiedDate
private Date updatedOn;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pk_sequence")
@Column(name = "id", nullable = false, columnDefinition = "bigint")
public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

@Version
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updated_on")
public Date getUpdatedOn() {
return updatedOn;
}

public void setUpdatedOn(Date updatedOn) {
this.updatedOn = updatedOn;
}
}


public interface MyEntityRepository extends JpaRepository<MyEntity, Integer> { }

@Service
@Transactional(readOnly = true)
public class MyEntityService {

@Autowired
private MyEntityRepository repository;

@Transactional
public MyEntity save(MyEntity myEntity) {
return repository.save(myEntity);
}
}

最佳答案

我也遇到了同样的问题。

就我而言,帮助我解决这个问题的重要项目是:
1)使用repository.saveAndFlush(...)方法

2) 使用findAllById()findByYourOwnQuery()(用@Query注释)。

总的来说,我的测试用例如下所示:

UserAccount userAccount = UserAccount.builder().username(username).build();
userAccountRepository.saveAndFlush(userAccount);

final LocalDateTime previousUpdateDate = userAccount.getUpdateDate();
....

List<BigInteger> ids = Arrays.asList(userAccountId);
UserAccount updatedUserAccount = userAccountRepository.findAllById(ids).get(0); // contains updated Audit data fields

...
assertThat(actual.getUpdateDate(), is(greaterThan(previousUpdateDate))); // true

重要的是,您不应该使用 repository.findOne(...) 因为它缓存了对对象 - read more 的引用。

关于java - Spring Data Repository 保存未返回具有更新审核字段的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20382586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com