在hibernate中,如果表有两个主键,如何使用load方法

在hibernate中,如果表有两个主键,如何使用load方法,hibernate,Hibernate,我正在创建一个带有两个主键的表。第一个是id(Integer),第二个是email(varchar2(50))。 我的映射文件包含 <hibernate-mapping package="suri.sahasra"> <class name="Person" table="PERSONS"> <composite-id name="pkField" class="PKField"> <key-propert

我正在创建一个带有两个主键的表。第一个是
id(Integer)
,第二个是
email(varchar2(50))
。 我的映射文件包含

<hibernate-mapping package="suri.sahasra">
    <class name="Person" table="PERSONS">
        <composite-id name="pkField" class="PKField">
            <key-property name="personId" column="person_id"/>
            <key-property name="email" column="email"/>
        </composite-id>

        <property name="firstName" column="first_name"/>
        <property name="lastName" column="last_name"/>
        <property name="age" column="age"/>
    </class>
</hibernate-mapping>

如果表包含两个主键,如何检索数据。请帮助我。

创建
PKField
的实例并将其传递给load()方法

注意

确保复合密钥类满足指定的条件

  • 它必须实现java.io.Serializable
  • 它必须重新实现equals()和hashCode(),并与数据库的复合键相等概念保持一致

创建
PKField
的实例,并将其传递给load()方法

注意

确保复合密钥类满足指定的条件

  • 它必须实现java.io.Serializable
  • 它必须重新实现equals()和hashCode(),并与数据库的复合键相等概念保持一致
    • 您必须使用

      Person p1=(Person) ss.load(Person.class,new PKField("1","email"));
      
      PKField必须实现.equals()和hashcode()方法, hibernate依靠这些方法来缓存和比较数据。

      您必须使用

      Person p1=(Person) ss.load(Person.class,new PKField("1","email"));
      
      PKField必须实现.equals()和hashcode()方法,
      hibernate依赖这些方法来缓存和比较数据。

      如果复合id的所有部分都匹配,则复合id意味着记录是相同的。也就是说,行

      ID  |  EMAIL
      ----+-------------------
      1   |  xyz@somewhere.com
      1   |  xyz@elsewhere.com
      
      表示要休眠的不同对象。因此,您需要将复合键的所有部分传递给
      load(…)
      ,以标识应该加载的对象


      如果您的意图是id本身唯一地标识一个记录,对于电子邮件也是如此,那么将其中一个声明为标识符,另一个声明为。您可能必须使用查询按自然id获取实体(不确定,我自己从未使用过)。复合id意味着如果复合id的所有部分都匹配,则记录是相同的。也就是说,行

      ID  |  EMAIL
      ----+-------------------
      1   |  xyz@somewhere.com
      1   |  xyz@elsewhere.com
      
      表示要休眠的不同对象。因此,您需要将复合键的所有部分传递给
      load(…)
      ,以标识应该加载的对象

      如果您的意图是id本身唯一地标识一个记录,对于电子邮件也是如此,那么将其中一个声明为标识符,另一个声明为。您可能必须使用查询来通过自然id获取实体(不确定,我自己从未使用过)