我正在创建一个包含两个主键的表。第一个是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());
如果表包含两个主键,如何检索数据。请帮帮我。
答案 0 :(得分:3)
你必须使用
Person p1=(Person) ss.load(Person.class,new PKField("1","email"));
和PKField必须实现.equals()和hashcode()方法, hibernate依赖这些方法来缓存和比较数据。
答案 1 :(得分:2)
创建PKField
的实例并将其传递给load()方法。
注意强>
确保您的复合键类符合指定的条件here
答案 2 :(得分:0)
复合ID表示如果复合ID的所有部分匹配,则记录是相同的。就是行
ID | EMAIL
----+-------------------
1 | xyz@somewhere.com
1 | xyz@elsewhere.com
代表不同的对象来休眠。因此,您需要将复合键的所有部分传递给load(...)
以标识应加载的对象。
如果您的意图是id本身唯一地标识记录,并且电子邮件相同,则将其声明为标识符,将另一个声明为natural-id。您可能必须使用查询来通过natural-id获取实体(不确定,我自己从不使用它们)。