nhibernate many-many отображающийся - дополнительный столбец в таблице отображения?

Во-первых, вы должны понимать «обычные арифметические преобразования» (эта ссылка для C, но правила в C ++ те же). В C ++, если вы выполняете арифметику со смешанными типами (вам следует избегать этого, когда это возможно, кстати), есть набор правил, которые решают, в каком типе выполняется вычисление.

В вашем случае вы вычитаете подписанное int из unsigned int. Правила продвижения гласят, что фактический расчет выполняется с использованием unsigned int.

Таким образом, вы вычислили 10 - 16 в беззнаковой арифметике. Арифметика без знака является арифметикой по модулю, что означает, что она оборачивается. Итак, при условии вашего типичного 32-битного целого, результат этого вычисления 2 ^ 32 - 6.

Это одинаково для обеих линий. Обратите внимание, что вычитание полностью не зависит от назначения; тип слева не имеет абсолютно никакого влияния на то, как происходит вычисление. Распространенной ошибкой новичка считается, что тип слева как-то влияет на вычисление; но float f = 5 / 6 равно нулю, потому что деление все еще использует целочисленную арифметику.

Разница в том, что происходит во время назначения. Результат вычитания неявно преобразуется в float в одном случае и int в другом.

Преобразование во float пытается найти самое близкое значение к фактическому, которое может представлять тип. Это будет очень большое значение; не совсем то, что было получено в оригинальном вычитании.

Преобразование в int говорит о том, что если значение попадает в диапазон int, значение не изменится. Но 2 ^ 32 - 6 намного больше, чем 2 ^ 31 - 1, который может содержать 32-битное целое, поэтому вы получаете другую часть правила преобразования, которая говорит, что полученное значение определяется реализацией. Это термин в стандарте, который означает, что «разные компиляторы могут делать разные вещи, но они должны документировать, что они делают».

Для всех практических целей все компиляторы, с которыми вы, вероятно, столкнетесь, скажут, что битовая комбинация остается неизменной и просто интерпретируется как подписанная. Из-за того, как работает арифметика дополнения 2 (так, что почти все компьютеры представляют отрицательные числа), в результате вы получите -6, который можно ожидать из расчета.

Но все это очень длинный способ повторения первого пункта, который гласит: «не делайте арифметику смешанного типа». Сначала приведите типы явно к типам, которые, как вы знаете, будут делать правильные вещи.

11
задан Greg 20 May 2009 в 18:33
поделиться

2 ответа

Вам необходимо добавить дополнительный класс, например UserRole, в код для сохранения дополнительных свойств.

Когда он приходит к отображению, это может быть отображено как класс, как вы упомянули. Но я также думаю, что его можно отобразить как составной элемент в сопоставлении ролей:

<set name="UsersInRole" lazy="true" table="UserRoles" >
  <key  column="RoleId" />
  <composite-element class="UserRole">
     <many-to-one name="User" column="UserId" not-null="true"/>
     <propery name="RelationState" not-null="true"/>
     <propery name="StartDate" not-null="true"/>
     <propery name="EndDate" not-null="true"/>
  </composite-element>
</set>

Все свойства не должны быть нулевыми, потому что они становятся частью первичных ключей таблицы UserRoles. Для получения дополнительной информации см .:

9
ответ дан 3 December 2019 в 10:26
поделиться

Добавить дополнительный класс.

0
ответ дан 3 December 2019 в 10:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: