Проблема критериев гибернации с составным ключом - PullRequest
4 голосов
/ 25 мая 2011

Я получил это отображение спящего режима:

<class name="CoverageTerm" table="coverage_term">

    <composite-id name="id" class="CoverageTermPK">
        <key-many-to-one name="productTerm" class="ProductTerm">
            <column name="termtype_id"></column>
            <column name="product_id" ></column>
        </key-many-to-one>
        <key-many-to-one name="productCoverage" class="ProductCoverage" column="product_coverage_id"></key-many-to-one>
    </composite-id>

    <property name="data"/>
</class>

Это простое составное сопоставление ключей со связью с таблицей productCoverage и составное связывание ключей с productterm.

Теперь проблема возникает в моей функции поиска:

public CoverageTerm getCoverageTermFromProductTermCoverage(ProductTerm productTerm, ProductCoverage productCoverage) {
    Criteria critCt = getSession().createCriteria(CoverageTerm.class);
    Criteria critCtId = critCt.createCriteria("id");
    critCtId.add(Restrictions.eq("productTerm", productTerm));
    critCtId.add(Restrictions.eq("productCoverage", productCoverage));
    return (CoverageTerm) critCt.uniqueResult();
}

Это должно позволить мне создать подкритерии для "id" (который является первичным ключом, CoverageTermPK) и добавить ограничения на него, но когда я его запускаю, я получаю сообщение об ошибке:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.QueryException: could not resolve property: productTerm of: CoverageTerm

Это странно, разве там не должно быть CoverageTermPK? Если я попытаюсь использовать подкритерии для свойства «data», с которыми работают критерии, я просто не смогу получить PK для подкритериев «id».

Есть идеи, почему это происходит?

1 Ответ

12 голосов
/ 25 мая 2011

Не уверен насчет вашей конкретной структуры класса, но попробуйте добавить идентификатор таким образом вместо отдельных критериев:

Restrictions.eq("id.productTerm", productTerm);
Restrictions.eq("id.productCoverage", productCoverage);
...