java - 如何构建使用 InheritanceType.SINGLE_TABLE 的子对象?
问题描述
我有几个对象都是一个班级的孩子。我正在使用 spring hibernate InheritanceType.SINGLE_TABLE 将它们存储到数据库中。
我有一个返回 ANY CHILD 对象的方法:
public Optional<? extends Product> getProductByID(long productId) {
LOGGER.info("Returning product with ID: " + productId);
return productDao.findById(productId);
}
当我编写导入时,我知道对象类型是什么。如何构建特定对象并访问特定于该孩子的 getter 和 setter?
我可以使用具有单独存储库的单个单独方法来完成它:
public Optional<Cassette> getCassetteByID(long productId) {
LOGGER.info("Getting Cassette with ID: {} from DB", productId);
return cassetteDao.findById(productId);
}
是否可以使用带有 if 语句的单个方法来代替?像这样的东西:
public Optional<? extends Product> getProductByID(long productId) {
LOGGER.info("Returning product with ID: " + productId);
if (productId <= 4) {
return brakeDao.findById(productId);
} else if (productId <= 9) {
return cassetteDao.findById(productId);
} else {
return productDao.findById(productId);
}
}
很抱歉这个冗长的问题,我不太确定如何解决这个问题。我想拥有完整的对象,这样我就可以获取特定的数据并根据需要进行更改。
解决方案
您可以有一个通用的方法,您可以在调用站点时指定您期望的类型。就像是:
public <T> Optional<T extends Product> getProductByID(long productId) {
LOGGER.info("Returning product with ID: " + productId);
Product result = productDao.findById(productId);
if (result instance of T) return result;
else return Optional.empty();
}
然后在调用站点上,您将使用:
Cassette received = myServiceClassInstance.<Cassette>getProductById(124);
尽管在大多数情况下这可能不是首选的做事方法。您也可以通过 T 类型切换以委托给特定的 Dao,但这可能更糟糕,因为继承树的更改意味着您必须修改该切换。
推荐阅读
- c# - Sendgrid API 返回 Forbidden C#
- react-native - 世博会:找不到变量要求
- c# - 如何使用动态到正常模型?
- linux - 尝试杀死正在运行的python脚本时“没有这样的进程”
- java - org.postgresql.util.PSQLException 在 DefaultLockRegistry#acquire 期间“违反唯一约束”
- url - 从 MS Word 的目录中清除 URL 链接
- java - 截屏并将图像显示到图库中
- haskell - 如何用“反射”包替换 ImplicitParams?
- reactjs - 错误无法读取未定义的属性“匹配”
- linux - 对主要命令输出的所有 PID 执行命令?