Java 如何处理复合密钥休眠

Java 如何处理复合密钥休眠,java,hibernate,jakarta-ee,hibernate-mapping,Java,Hibernate,Jakarta Ee,Hibernate Mapping,我的hbm.xml文件如下所示: <hibernate-mapping> <class name="pojopackage.WordhelperWordusage" table="WORDHELPER_WORDUSAGE" schema="SOZANA"> <composite-id name="id" class="pojopackage.WordhelperWordusageId"> <key-property name="i

我的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>
但它给了我这样的例外:

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

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

复合PK通常映射到PK类,以便Hibernate能够正确地处理它们。这就是您发布的映射的情况。注意,使用PK类不是强制性的,如果在

元素中使用
属性,则可以将这些PK属性映射到非常相同的
WordHelperOrdUsage
类中(但不建议这样做)。有关详细信息,请参阅此相关问题:

对于给定映射文件的实现,创建具有映射中属性的类难道还不够吗

package pojopackage;

public class WordhelperWordusage { 

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

    // Getters / Setters

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

记住在这些类中一致地实现
hashCode()
equals()
。因此,
WordhelperWordusage
的散列码是其id的散列码,当且仅当其id相等时,它们才相等。对于id类,只需对两个整数属性进行散列,并比较它们是否为
equals()

,这会对您有所帮助

谢谢Xavi的回复,你之前帮了我一把,我知道了,但我已经更新了问题,你能给我一个建议吗?错误表明你试图保存
wordhelper\u wordusage
,但没有设置
id
。在执行
session.save之前(wordhelper\u wordusage)
您应该实例化一个
新单词helperwordusageid()
并设置它的
Integer
属性。使用
setId()
将其设置为
wordhelper\u wordusage
。好的,我知道了,我可以自动生成该ID吗?就像一个增量给定您提供的映射文件,您应该设置其
类型
idwu
属性,确保它们是唯一的。好的,我按照您所说的进行了更正,这很好,但我遇到了另一个错误,您能看一下吗?
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.

}