如何构建使用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,但这可能更糟,因为继承树中的更改意味着您必须修改该切换。

最新更新