我有一个类似的场所映射类:

<class name="Venue">
        <id name="venueId">
            <generator class="identity"/>
        </id>
        <natural-id>
            <property name="name"/>
            <property name="countryISO2"/>
        </natural-id>
        <property name="name"/>
        <property name="locale"/>
        <component name="location">
            <property name="countryISO2"/>
            <property name="city"/>
        </component>
</class>


问题是无法以这种方式识别name="countryISO2"标记中的natural-id属性。我还尝试了name="location.countryISO2",该方法也不起作用。

有人可以建议如何解决这个问题吗?

更新:

例外是:

Caused by: org.hibernate.PropertyNotFoundException: field [countryISO2] not foun
d on nl.texxi.oct.model.Venue
        at org.hibernate.property.DirectPropertyAccessor.getField(DirectProperty
Accessor.java:182)
        at org.hibernate.property.DirectPropertyAccessor.getField(DirectProperty


地点类别为:

public class Venue {

    private int                    venueId;
    private String                 name;
    private Locale                 locale;
    private Location               location;
    // getters and setters
}


当然还有Location类,其中包含一些字段,例如countryISO2city

在数据库中,venue表包含:venueId, name, locale, countryIso2, city因此,基本上,位置是仅域模型上某些字段的组成。

最佳答案

根据休眠DTD,这应该可以解决您的问题

     <natural-id>
        <component name="location">
            <property name="countryISO2"/>
            <property name="city"/>
        </component>
    </natural-id>


并且您应该删除映射底部的<component>

10-04 14:10