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

时间:2011-12-26 19:00:55

标签: hibernate

我正在创建一个包含两个主键的表。第一个是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>

现在我尝试使用load方法选择数据,但它提出了一个typeMisMatch Exception 我的加载功能是:

Person p1=(Person) ss.load(Person.class,new Integer("1"));
System.out.println(p1.getFirstName());
System.out.println(p1.getLastName());
System.out.println(p1.getAge());

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

3 个答案:

答案 0 :(得分:3)

你必须使用

Person p1=(Person) ss.load(Person.class,new PKField("1","email"));

和PKField必须实现.equals()和hashcode()方法, hibernate依赖这些方法来缓存和比较数据。

答案 1 :(得分:2)

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

注意

确保您的复合键类符合指定的条件here

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

答案 2 :(得分:0)

复合ID表示如果复合ID的所有部分匹配,则记录是相同的。就是行

ID  |  EMAIL
----+-------------------
1   |  xyz@somewhere.com
1   |  xyz@elsewhere.com

代表不同的对象来休眠。因此,您需要将复合键的所有部分传递给load(...)以标识应加载的对象。

如果您的意图是id本身唯一地标识记录,并且电子邮件相同,则将其声明为标识符,将另一个声明为natural-id。您可能必须使用查询来通过natural-id获取实体(不确定,我自己从不使用它们)。