首页 > 解决方案 > 如何构建使用 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);
        }
    }

很抱歉这个冗长的问题,我不太确定如何解决这个问题。我想拥有完整的对象,这样我就可以获取特定的数据并根据需要进行更改。

标签: javahibernateinheritancerepositorypersistence

解决方案


您可以有一个通用的方法,您可以在调用站点时指定您期望的类型。就像是:

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


推荐阅读