Свободный NHibernate: «... когда новый объект создается в памяти, тогда его поле идентичности не определено» - PullRequest
1 голос
/ 14 августа 2011

Кто-нибудь знает, как можно сделать объект таким образом, чтобы он имел что-то в своем поле идентификации - чтобы я мог затем использовать это для получения хеш-кода.

Ответы [ 2 ]

2 голосов
/ 14 августа 2011

Один из вариантов - использовать Guid в качестве идентификатора.Таким образом, вам не нужно использовать обход базы данных для получения значения идентификатора.

    <id name="_id" column="PersonId" >
        <generator class="assigned" />
    </id>

Или

Id(x => x.Id)
  .Column("PersonId")
  .GeneratedBy.Assigned();

Тип столбца «PersonId» должен быть uniqueidentifier , если выиспользовать SQL Server.Затем, когда вы создаете объект, вы можете использовать Guid.NewGuid () для генерации нового идентификатора.

public class Person {
    private Guid _id;

    public Person() {
        _id = Guid.NewGuid();
    }

    public Guid Id {
        get { return _id; }
    }
}

Преимущество этого подхода состоит в том, что ваш код более отделен от базы данных.Это будет очень полезно во время тестов и если вам нужно поддерживать «отключенные» сценарии.Потенциальным недостатком является производительность во время соединений (Google "Guid vs Int первичный ключ").См. this для получения дополнительной информации о генераторах идентификаторов в NHibernate.

В качестве примечания вы можете переосмыслить свой дизайн и реализовать свои Equals и GetHashCode с использованием бизнес-ключа.В этом случае вам не понадобится идентификация Guid.С Не позволяйте Hibernate украсть вашу личность :

"Мы рекомендуем реализовать equals () и hashCode (), используя равенство бизнес-ключей. Равенство бизнес-ключей означает, что equals ()метод сравнивает только свойства, которые формируют бизнес-ключ, ключ, который идентифицирует наш экземпляр в реальном мире (естественный ключ-кандидат) "(Hibernate Reference Documentation v. 3.1.1).

1 голос
/ 14 августа 2011

ПОЧЕМУ это зависит от того, какого типа параллелизма вы хотите достичь, как долго будет работать ваша единица работы ... хотя идентификаторы GUI и HILO звучат все причудливо и круто, в большинстве случаев они не нужны.

относительно вашей проблемы, вам нужно сохранить базу данных для генерируемого идентификатора, при условии, что идентификатор представляет собой автоматически увеличивающийся идентификатор, сгенерированный базой данных, это может удерживать временную блокировку этой таблицы до тех пор, пока ваша транзакция не будетзафиксировано, но это один из недостатков наличия автоматически увеличивающегося идентификатора

, и другая причина, почему вы должны сохранять и сравнивать объект с чем-то другим, если у него есть другой идентификатор ..

Скажите, что ученик - это ваш класс с двумя свойствами: Идентификатор, Имя, Школа

Теперь, если вы хотите узнать, является ли это один и тот же ученик, вы, вероятно, хотите, чтобы ваш хэш генерировался для Имени и Школы, а не для Идентификатора

...