Java 如何处理复合密钥休眠
我的hbm.xml文件如下所示: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
<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.
}