TL:DR;
Каков правильный синтаксис/обходной путь/хак для компонентов CF ORM, которые имеют ограничения внешнего ключа?
ColdFusion + Целые числа
Сохранение переменной в виде целого числа должно быть простым вопросом программирования, верно? Найдите соответствующую функцию в документации по языку (если вы не можете вспомнить ее сразу), которая будет говорить returns: int (owtte), и используйте ее.
Не с ColdFusion.
Некоторые из вас, возможно, уже знакомы с различные проблемы с целыми числами, но одна из них, которая в настоящее время вызывает у меня быстрое выпадение волос, заключается в том, что ColdFusion иногда сохраняет ваше "целое число" как строку, двойную или длинную. Теперь, в большинстве случаев использования, это не проблема, нарушающая функциональность, и ее часто упускают из виду/игнорируют/не обнаруживают. Исключением в моем случае является случай, когда в игру вступает ORM. Конечно, как и любой здравомыслящий разработчик, я признаю возможность того, что где-то это связано с ошибкой пользователя.
Проблема
Проблема возникает всякий раз, когда CF пытается взаимодействовать с БД. Если есть поле, которое является внешним ключом и имеет тип «целое число», CF выдает исключение Hibernate со следующим сообщением:
java.lang.Integer
Вот и все. Полезно, правда? Я обнаружил, что это «сообщение об ошибке» явно является типом переменной, которую вы передаете в это поле, поэтому, если вы ошибочно передадите двойное значение в поле, сообщение об ошибке будет читаться как java.lang.Double
.
Теперь это, кажется, не столько о самом поле, сколько о связанных компонентах - это происходит только с полем, которое имеет ограничение внешнего ключа, связывающее его с целочисленным полем где-то еще.
Основной пример того, что я собираюсь сделать:
Шаблон.cfc
component persistent="true" table="template"{
property name="id" type="numeric" sqltype="integer" column="templateID" fieldtype="id" generator="identity";
property name="userID" type="numeric" sqltype="integer" fkcolumn="userID" fieldtype="many-to-one" cfc="User";
property name="lastModified" type="date" sqltype="timestamp" column="lastModified";
}
User.cfc
component persistent="true" table="user"{
property name="id" type="numeric" sqltype="integer" column="userID" fieldtype="id" generator="identity";
property name="username" type="string" sqltype="nvarchar" column="username";
property name="password" type="string" sqltype="nvarchar" column="password";
}
Проблема возникает при сбросе ORM с обновлением template.userID
.
Вещи, которые я пробовал
- Обращение в службу поддержки Adobe CF (у нас есть корпоративная лицензия с платиновой поддержкой, но за месяц они не смогли дать мне решение или даже какую-либо информацию, кроме «это не работает?»)
- Добавление атрибута
ormtype
в поля идентификации (а затем в поля внешнего ключа, когда это не сработало) - Изменение свойства
sqltype
(которое, как я теперь считаю, предназначено только для создания таблицы, в котором мы никогда не нуждались, так как база данных уже была на месте) - Converting the variable using various combinations of the following functions:
NumberFormat( var )
- documentation says it returns 'A formatted number value', actually returns ajava.lang.String
LSParseNumber( var )
- возвращает двойнойInt( var )
– Это здорово: в документации сказано, что он возвращает целое число в виде строки. На самом деле возвращаетjava.lang.Double
Val( var )
- возвращает двойнойjavaCast( 'int', var )
- возвращает целое число, которое выдает ту же ошибку
- Установка атрибута
elementtype
для свойства (оба конца) - Ослабление атрибута
validate
в свойстве (оба конца) до «числового»
Я подозреваю, что это может быть связано с комбинацией Hibernate и CF, а не только с CF, и, несмотря на его причуды, напоминающие javascript, я все еще люблю его.
Окружающая обстановка
- Windows Server 2012 R2
- ColdFusion 2016 (предприятие)
- SQL-сервер
int
- person James Cushing   schedule 21.08.2017int
- спасибо за то, что помогли мне понять, что я еще не добавил БД в свою среду выше. - person James Cushing   schedule 22.08.2017