我的 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);
但它给了我这样的异常(exception):
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
最佳答案
复合 PK 通常映射到 PK 类,以便 Hibernate 可以正确处理它们。您发布的映射就是这种情况。请注意,并非强制使用 PK 类,您可以将这些 PK 属性映射到相同的 WordhelperWordusage
中。类,如果您省略 class
<composite-id>
中的属性元素(不过不推荐)。有关更多详细信息,请参阅此相关问题:hibernate composite key .
对于给定映射文件的实现,使用映射中的属性创建类还不够吗?
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()
在这些类(class)中始终如一。这样一个WordhelperWordusage
的哈希码是其 id 的哈希码,当且仅当它们的 id 相等时它们才相等。对于 id 类,只需散列两个 Integer 属性,然后比较它们的 equals()
.
关于java - 如何处理复合键 hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12707978/