【发布时间】:2021-10-26 14:19:14
【问题描述】:
我正在使用 Spring 和 Hibernate 用 Java 构建 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