【问题标题】:Java API: Data treatmentJava API:数据处理
【发布时间】:2021-10-26 14:19:14
【问题描述】:

我正在使用 Spring 和 Hibernate 用 Ja​​va 构建 API。我的情况是:

我有一个包含 3 个外键的表,多对一,因为哪些可以接收空值。问题:

当我要在这个表中保存一些数据并向我的 API 发送一个空值 id 时,我有一个关于如何处理它的问题......因为在我的模型中,我总是必须设置一个外键模型的实例,对吗?例如:发布 -> 用户

releases 表有一个 user_id,所以我的 Release 模型中有一个“私人用户用户”;而且我必须做一个setUser,如果我想保存一个外键,所以当我想保存一个发布时,我必须先在数据库中搜索它的记录,对吗?例如:User user = userRepository.findById(getUserId()).Get(); release.setUser(user);

但是如果 user_id 来自我的 API 的 null 怎么办?我该怎么做呢?因为,如果null,它会在findById函数中报错。我是否必须在保存之前用 ifs 检查值是否为空来填充代码?我认为这不太理想...我认为如果 user_id 必须为null,我的前端可以发送一个值 0,那么它不会搜索记录,但它会在get() 试图找到它时的函数。

所以我的问题是,在 Java api 中处理可以为空并带有 null 值的外键的最佳方法是什么?

提前致谢。

那么我每次都必须做这样的情况来验证 ID 吗?使用通用异常,我不用担心,如果 id 是null

@Service
public class CreditCardService 
{
    @Autowired
    private CreditCardRepository creditCardRepository;
    
    public CreditCard findById(Integer id)
    {
        try {
            return creditCardRepository.findById(id).get();
        } catch (Exception e) {
            return null;
        }     
    }
}

这是我的数据转换和保存服务:

@Service
public class ConvertService 
{
    @Autowired
    private CreditCardService creditCardService;
    
    /**
     * Convert data to release model type
     * 
     * @return Release
     */
    public Release convert(CreateReleaseValidator data)
    {
        Release release = new Release();

        release.setDescription(data.getDescription())
            .setStatus(data.getStatus())
            .setType(data.getType())
            .setValue(data.getValue())                
            .setCreditCard(creditCardService.findById(data.getCreditCardId()));
    
        return release;
    }
}

我只是想了解最佳实践是什么,我真的很感激

【问题讨论】:

  • 如果外键可能为空(或某些未知键),您需要检查并处理它。对于空键或空键,不要进行任何查找,对于未知键检查,查找返回的内容。在这两种情况下,您都没有用户来链接您的实体,因此您要么必须在没有它的情况下保存它(使关系可选),要么使用一些备用用户(例如查找默认值)或向调用者报告错误。
  • 根据您的问题陈述,您似乎需要将关系设为可选,并将列设为可为空,因此如果您从调用方收到 null,您可以检查是否为 null,然后设置 null,否则获取值并设置。
  • 进行此验证的最佳方法是什么?类似的东西: public Release findById(Integer id) { if (id.isPresent()) { //然后如果寄存器不存在我在异常中处理 try catch, 在外面 Release release = releaseRepository.findById(id.get ())。得到();返回释放; } 返回空值; }?我不知道它在java中是否正常每次都制作这种类型的函数

标签: java spring api hibernate spring-data-jpa


【解决方案1】:

通常你会这样做:

    public CreditCard findById(Integer id)
    {
        if (id != null) {
            return creditCardRepository.findById(id).get();
        } else {
            return null;
        }     
    }

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2016-04-20
    • 2011-01-10
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多