Как заставить спящий режим не сохранять равные объекты - PullRequest
1 голос
/ 27 января 2012

Мои методы equals () и hashcode () были переписаны правильно. Но когда Я сохраняю равные объекты, они появляются в базе данных. Как я могу решить эту проблему? Я хочу иметь уникальный набор элементов в базе данных. Благодарю.

Вот файл сопоставления:

<hibernate-mapping>
    <class name="vertical.model.filter.Filter" table="FILTER">
        <id name="id" type="long">
            <generator class="native"/>
        </id>
        <discriminator column="TYPE" type="string"/>
        <subclass name="vertical.impl.filter.AbstractFilter" abstract="true">
            <set name="options" table="FILTER_OPTION" cascade="all">
                <key column="FILTER_ID"/>
                <many-to-many column="OPTION_ID" class="vertical.model.filter.FilterOption"/>
            </set>
            <subclass name="vertical.impl.services.filter.GrfFilter"
                      discriminator-value="rabota">

            </subclass>
        </subclass>

    </class>

</hibernate-mapping>

1 Ответ

1 голос
/ 08 апреля 2012

Это классическая проблема без теоретического решения, но есть практические способы ее решения.

Позвольте мне взять несколько строк из статьи ;

Проблема связана с различиями между идентификацией объекта в виртуальной машине (VM) и идентификацией объекта в базе данных. В виртуальной машине вы не получите идентификатор для объекта; вы просто держите прямые ссылки на объект. За кулисами виртуальная машина назначает восьмибайтовый идентификатор, который и является ссылкой на объект. Проблемы начинаются, когда вы сохраняете объект в базе данных. Допустим, вы создали объект Person и сохранили его в базе данных (person1). Где-то еще в вашем коде вы читаете данные Person и создаете новый объект Person (person2). Теперь у вас есть два объекта в памяти, которые отображаются на одну и ту же строку в базе данных. Ссылка на объект может указывать только на одну или другую, но нам нужен способ показать, что это действительно одна и та же сущность. Вот где приходит личность объекта.

То, что вы должны сделать, это просто, переопределить equals() и hashcode() в соответствии с бизнес-функциями сущностей.

Вот предлагаемое решение с форума hibernate статья ;

Разделение идентификатора объекта и бизнес-ключа Чтобы избежать этой проблемы, мы рекомендуем использовать «полу» -уникальные атрибуты вашего постоянного класса для реализации equals () (и hashCode ()). По сути, вы должны думать, что идентификатор вашей базы данных вообще не имеет делового значения (помните, что в любом случае рекомендуется использовать атрибуты суррогатного идентификатора и автоматически сгенерированные значения). Свойство идентификатора базы данных должно быть только идентификатором объекта и в основном должно использоваться только Hibernate. Конечно, вы также можете использовать идентификатор базы данных в качестве удобного дескриптора, доступного только для чтения, например, строить ссылки в веб-приложениях.

...