【问题标题】:Spring JPA with Hibernate: How to verify that an object was saved?Spring JPA with Hibernate:如何验证对象是否已保存?
【发布时间】:2018-08-05 01:18:15
【问题描述】:

您如何验证,例如,在 UserRepository 对象(使用 @Repository("userRepository") 注释)中调用了保存(用户实体)(CrudRepository 实现)方法的 UserService 对象之后,该对象确实已保存并且没有问题。

几乎所有的教程都倾向于忽略这种情况,并让服务类中的 save(User user) 方法无效。

【问题讨论】:

  • 存在其他(可能更好且普遍接受的)方法。比如,你争论:“在需要的时候允许例外。抓住一些地方,你可以做出一些好的决定。”

标签: java spring hibernate jpa save


【解决方案1】:

您可以为此创建一个集成测试,使用 H2 内存数据库。

代码会是这样的:

@RunWith(SpringRunner.class)
@SpringBootTest
class UserInsertTest {

    @AutoWired
    private UserService userService;

    @AutoWired
    private UserRepository userRepository;

    @Test
    public void insert() {
        UserEntity user = userService.save(new UserEntity());
        assertNotNull(userRepository.findOne(user.getId());
    }

}

【讨论】:

  • 谢谢!您能否告诉我为什么在大多数教程中,作者在服务类中将保存方法实现为 void?基本上,无法像您的示例中那样验证结果。
  • 我不能说这是否如此普遍。返回实体(或应用程序中用户类的表示形式)很重要,因为在保存过程中,保存的用户可以获得新信息(如:创建日期、id 等),这些信息对于调用该方法的人很重要.并且更容易测试该方法:)
  • 接受了,但这不好,一般,答案。而是“添加一些代码,因为算法设计得不好”
  • Jacek,您的建议是一个更笼统的答案。但它也朝着正确的方向发展,非常有帮助,所以我投了赞成票,谢谢。
【解决方案2】:

我的做法是创建一个只包含一个布尔值的包装类。

parseSaveUserResponse(userDao.save(user))

private SaveUserResponse parseSaveUserResponse(final User user) {
        return new SaveUserResponse(user != null);
  }

在这里,我创建了一个包装类,如果保存成功,它的字段将为 true。如果我们要公开我们的 api,这是一个很好的做法。

【讨论】:

  • jpa 保存方法永远不会返回 null
【解决方案3】:

这个怎么样?

@Service
public class RepositoryWrapper {

    public <T, ID> boolean save(JpaRepository<T, ID> jpaRepository, T t, Function<T, ID> getIdFunc) {
        jpaRepository.save(t);
        return jpaRepository.existsById(getIdFunc.apply(t));
    }

    public <T, ID> boolean delete(JpaRepository<T, ID> jpaRepository, ID id) {
        jpaRepository.deleteById(id);
        return !jpaRepository.existsById(id);
    }

}  

并使用。

@RestController
public class MyController {

    @Autowired
    private UserRepository userRepository;
    @Autowired
    private RepositoryWrapper repositoryWrapper;

    @PostMapping("/my")
    public ResponseEntity<?> save(User user) {
        // Check parameter...

        if(repsitoryWrapper.save(userRepository, user, _user -> _user.getId())) {
            // Success
        }
        else {
            // Fail
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2018-10-26
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多