【问题标题】:How to use Hibernate composite-id without class?如何在没有类的情况下使用 Hibernate 复合 ID?
【发布时间】:2014-02-06 04:43:19
【问题描述】:

我正在尝试如下映射 xml 中的键:

    <composite-id>
        <key-property name="userId" column="USER_ID" />
        <key-property name="passwordsBack" column="PASSWORDS_BACK" />
    </composite-id>

我在文档、“Hibernate in Action”和其他地方看到了这种结构,没有 class="BlahPK"。但是,当我尝试获取时,我得到:

Initial SessionFactory creation failed.org.hibernate.MappingException: composite-id class must implement Serializable: MyClass

这是一个非常简单的数据类,它不是可变的,我不需要密钥,当然也不想改造我的对象并定义一个单独的公共类只是为了用 Hibernate 读取它。目前,我已经习惯使用 rowid 作为 id,但我宁愿让映射清楚地反映表和对象的使用方式。

免责声明:我搜索了 StackOverflow,我发现的只是 how to handle composite key hibernate,它只是说“不要这样做,但你可以。”

【问题讨论】:

    标签: java hibernate orm hibernate-mapping


    【解决方案1】:

    您可以在实体类中定义多个@Id 属性。喜欢

    @Entity 
    class User implements Serializable {
      @Id
      private String userId;
    
      @Id
      private String passwordsBack;
    ..
    }
    

    只有 Hibernate 支持,JPA 不支持。当您尝试将其加载到会话中时,您需要创建一个 User 实例并设置 id 属性并调用session.load(User.class, userinstance)

    我发现这个hibernate 文档有助于理解这一点。 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-mapping-identifier 您需要查找的部分是 2.2.3.2.2。多个@Id 属性。

    编辑:刚刚意识到您需要 xml 描述而不是基于注释的解决方案。可能有类似于这种方法的东西。让我看看能不能给你一个参考。

    更新:如果您可以将您的课程MyClass 更改为实现Serializable,这将解决问题,并且不需要另一个公共 PK 课程。您需要有 equalshashCode 方法,它们将使用您的 id 字段。

    【讨论】:

    • 谢谢!是的,我需要 XML 语法,这是我缺少的 Serializable。异常表明选择的类需要是可序列化的,但他们没有说他们选择了封闭类作为默认值,我没有猜到。
    猜你喜欢
    • 2012-05-23
    • 2022-11-07
    • 2012-02-21
    • 2023-03-10
    • 2015-06-16
    • 1970-01-01
    • 2012-09-30
    • 2011-12-07
    • 2011-01-18
    相关资源
    最近更新 更多