java - 如何处理复合键 hibernate

标签 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="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/

相关文章:

java - 如何使用 Mockito 在另一个 Mock 类中模拟 Spring 消息资源?

Java在循环中绘制移动矩形

java - 如何在Android中使用服务器发送的事件(SSE)?

java - 连接数量比它可能多

hibernate - 具有多个数据库供应商支持的 Java/Maven/JPA/Hibernate 构建的最佳方法?

java - 针对客户和员工的 Spring Security 用户身份验证

java - 自定义 LogBack 附加程序失败并出现 java.lang.ClassNotFoundException

spring - 2 来自不同实体 Hibernate 的外键插入新表

javascript - 如何使用 Ajax 和 Servlet 上传文件

java - 在 TomEE 8 中的 javax.ws.rs.container.ContainerRequestFilter 中注入(inject)资源