Как использовать метод загрузки, если таблица имеет два первичных ключа в спящем режиме - PullRequest
1 голос
/ 26 декабря 2011

Я создаю таблицу с двумя первичными ключами.Первый - 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>

Теперь я пытаюсь выбрать данные, используя метод загрузки, но он вызывает исключение typeMisMatch.
Моя функция загрузки:

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 ]

3 голосов
/ 26 декабря 2011

Вы должны использовать

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

, и PKField должен реализовать методы .equals () и hashcode (), hibernate использует эти методы для кэширования и сравнения данных.

2 голосов
/ 26 декабря 2011

Создайте экземпляр PKField и передайте его методу load ().

ПРИМЕЧАНИЕ

Убедитесь, что ваш класс составного ключа удовлетворяет условиям, указанным здесь

  • Он должен реализовывать Java.io.Serializable.
  • Он должен повторно реализовать equals () и hashCode () в соответствии с представлением базы данных о равенстве составных ключей.
0 голосов
/ 26 декабря 2011

Составной идентификатор означает, что записи идентичны, если все части составного идентификатора совпадают. То есть строки

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

представляет различные объекты в спящем режиме. Поэтому вам нужно передать все частей составного ключа в load(...), чтобы определить объект, который должен быть загружен.

Если вы намереваетесь, что идентификатор сам по себе уникально идентифицирует запись и то же самое для электронной почты, объявите одну как идентификатор, а другую как natural-id . Возможно, вам придется использовать запросы, чтобы получить сущность по натуральному идентификатору (не уверен, я никогда не использую их сам).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...