【问题标题】:how to handle composite key hibernate如何处理复合键休眠
【发布时间】:2012-10-03 11:56:11
【问题描述】:

我的 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

【问题讨论】:

    标签: java hibernate jakarta-ee hibernate-mapping


    【解决方案1】:

    复合 PK 通常映射到一个 PK 类,以便 Hibernate 可以正确处理它们。您发布的映射就是这种情况。请注意,使用 PK 类不是强制性的,如果您在 &lt;composite-id&gt; 元素中省略 class 属性,您可以将这些 PK 属性映射到相同的 WordhelperWordusage 类中(虽然不推荐)。有关详细信息,请参阅此相关问题: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()。这样WordhelperWordusage 的哈希码就是它的 id 的哈希码,当且仅当它们的 id 相等时它们才相等。对于 id 类,只需对两个 Integer 属性进行哈希处理,然后比较它们是否为 equals()

    【讨论】:

    • 感谢 Xavi 的回复,您之前帮我解决了这个问题,但我已经更新了问题,您能给我一个建议吗?
    • 该错误表明您正在尝试保存 wordhelper_wordusage 而不为其设置 id。在执行session.save(wordhelper_wordusage); 之前,您应该实例化一个new WordhelperWordusageId() 并设置它的Integer 属性。之后将其设置为wordhelper_wordusagesetId()
    • 好的,我知道了,我可以让那个 ID 自动生成吗?像增量
    • 鉴于您提供的映射文件,您应该设置其typeidwu 属性,确保它们是唯一的。
    • 好的,我按照你说的更正了,没问题,但我又遇到了一个错误,你能看看吗? stackoverflow.com/questions/12706842/…
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多