0

我的 hbm.xml 文件是这样的:

<hibernate-mapping>
<class name="pojopackage.WordhelperWordusage" table="WORDHELPER_WORDUSAGE" schema="SOZANA">
    <composite-id name="id" class="pojopackage.WordhelperWordusageId">
        <key-property name="idwh" type="java.lang.Integer">
            <column name="IDWH" />
        </key-property>
        <key-property name="idwu" type="java.lang.Integer">
            <column name="IDWU" />
        </key-property>
        <key-property name="type" type="java.lang.Integer">
            <column name="TYPE" />
        </key-property>
    </composite-id>
    <many-to-one name="wordhelper" class="pojopackage.Wordhelper" update="false" insert="false" fetch="select">
        <column name="IDWH" />
    </many-to-one>
    <many-to-one name="wordusage" class="pojopackage.Wordusage" update="false" insert="false" fetch="select">
        <column name="IDWU" />
    </many-to-one>
</class>

但是我有两个 POJO 类,它们是“WordhelperWordusage.java”和“WordhelperWordusageId.java”,所以我很困惑,我应该如何处理这些类?如何实施?提前致谢! 更新

我确实喜欢这个

wordhelper_wordusage.save(wordhelper);
wordhelper_wordusage.save(wordusage);
session.save(wordhelper);
session.save(wordusage);
session.save(wordhelper_wordusage);

但它给了我这样的例外:

Hibernate: select max(ID) from SOZANA.WORDFORM
Hibernate: select max(ID) from SOZANA.WORDHELPER
Exception in thread "main" org.hibernate.id.IdentifierGenerationException:
ids for this   class must be manually assigned before calling save():   pojopackage.WordhelperWordusage

4

3 回答 3

2

复合 PK 通常映射到一个 PK 类,以便 Hibernate 可以正确处理它们。您发布的映射就是这种情况。请注意,使用 PK 类不是强制性的WordhelperWordusage,如果您class在元素中省略该属性,您可以将这些 PK 属性映射到同一个类中<composite-id>(但不推荐)。有关更多详细信息,请参阅此相关问题:休眠复合键

至于给定映射文件的实现,在映射中创建具有属性的类还不够吗?

package pojopackage;

public class WordhelperWordusage { 

    private WordhelperWordusageId id;
    private Wordhelper wordhelper;
    private Wordusage wordusge;

    // Getters / Setters

    // Implement equals() and hashCode() delegating to id
}

package pojopackage;

public class WordhelperWordusageId { 
    private Integer idwu;
    private Integer type;

    // Getters / setters

    // Implement equals() and hashCode() consistently, using idwu and type.

}

请记住始终如一地在这些类中实现hashCode()和。equals()所以 aWordhelperWordusage的哈希码是它的 id 的哈希码,当且仅当它们的 id 相等时它们才相等。对于 id 类,只需对两个 Integer 属性进行哈希处理,然后将它们比较为equals().

于 2012-10-03T12:11:23.440 回答
0

WordhelperWordusageId.java 类用于构建主键。它有两个属性 idwh 和 idwu。此属性的组合定义了主键。Hibernate 为复合键创建对象并覆盖 equals 和 hashCode 方法。此对象用于标识主 WordhelperWordusage.java 对象的键。因此为简单起见,将对象视为简单的 id 列属性,唯一的区别是这是对象而不是简单属性,否则所有规则都适用于 ID。异常生成器方案。

于 2012-10-03T12:10:50.900 回答
0

这可以帮助你 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-declaration-component

于 2012-10-03T12:11:56.187 回答