Вставить не удается при попытке получить вставленную строку - PullRequest
0 голосов
/ 11 августа 2011

У меня есть объект, идентификатор которого является сгенерированным GUID в базе данных SQL Server (это сторонняя база данных, для которой я не могу изменить схему), и поле определено таким образом;

@Id
@GenericGenerator(name="generator", strategy="guid", parameters = {})
@GeneratedValue(generator ="generator")
@Column(name="FarmID")
public String getId() {
    return id;
}

Когда я создаю новую сущность и сохраняю ее, идентификатор сначала правильно генерируется GUIDGenerator, вызывающим newid () , затем строка вставляется с использованием сгенерированного идентификатора в качестве значения параметра. Однако после вставки Hibernate пытается извлечь вновь вставленную строку, но не удается, и оказывается, что он использует пустое значение id - вот журнал трассировки;

[main]  AbstractBatcher                DEBUG about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
[main]  SQL                            DEBUG 
select
    newid()
[main]  AbstractBatcher                TRACE preparing statement
[main]  GUIDGenerator                  DEBUG GUID identifier generated: 5B5495B4-FFE3-4112-B079-4FB799320BA7
[main]  AbstractBatcher                DEBUG about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
[main]  AbstractBatcher                TRACE closing statement
[main]  ConnectionManager              TRACE registering flush begin
[main]  AbstractBatcher                DEBUG about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
[main]  SQL                            DEBUG 
insert 
into
    Farm
    (FarmBusinessID, FarmName, PortalFarm, FarmID) 
values
    (?, ?, ?, ?)
[main]  AbstractBatcher                TRACE preparing statement
[main]  BasicBinder                    TRACE binding parameter [1] as [VARCHAR] - F2542B84-82E4-4DF6-BDBB-E830BFE5DDC1
[main]  BasicBinder                    TRACE binding parameter [2] as [VARCHAR] - XXXXXX XXXXX (XXX)
[main]  BasicBinder                    TRACE binding parameter [3] as [BIT] - true
[main]  BasicBinder                    TRACE binding parameter [4] as [VARCHAR] - 5B5495B4-FFE3-4112-B079-4FB799320BA7
[main]  AbstractBatcher                DEBUG about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
[main]  AbstractBatcher                TRACE closing statement
[main]  ConnectionManager              TRACE registering flush end
[main]  HQLQueryPlan                   TRACE find: select id from agronomy.model.hub.Farm where id = :id
[main]  AbstractBatcher                DEBUG about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
[main]  SQL                            DEBUG 
select
    farm0_.FarmID as col_0_0_ 
from
    Farm farm0_ 
where
    farm0_.FarmID=?
[main]  AbstractBatcher                TRACE preparing statement
[main]  BasicBinder                    TRACE binding parameter [1] as [VARCHAR] - 
[main]  AbstractBatcher                DEBUG about to open ResultSet (open ResultSets: 0, globally: 0)
[main]  AbstractBatcher                DEBUG about to close ResultSet (open ResultSets: 1, globally: 1)
[main]  AbstractBatcher                DEBUG about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
[main]  AbstractBatcher                TRACE closing statement
[main]  JDBCExceptionReporter          WARN  SQL Error: 8169, SQLState: S0002
[main]  JDBCExceptionReporter          ERROR Conversion failed when converting from a character string to uniqueidentifier.

Я не знаю, что я явно вызываю этот последний SELECT (который терпит неудачу), поэтому я не уверен, где я могу посмотреть, почему он терпит неудачу. Ошибка SQL примерно переводится как «вы не можете использовать пустую строку в качестве значения uniqueidentifier», что скорее имеет смысл.

1 Ответ

0 голосов
/ 16 августа 2011

Я никогда не мог докопаться до сути, но, если повезет, я ошибочно подумал, что это сторонний БД, который создавал мне эту проблему, хотя на самом деле схема была под нашим контролем.

Просто изменив первичные ключи таблиц на BIGINT (заданные как столбцы идентификаторов) и изменив типы данных идентификаторов сущностей на Long, я смог повторно запустить тестовый код, и сущности были правильно сохранены в базе данных , Все сработало, как и ожидалось, и я мог перестать рвать слух и ругаться.

Было бы неплохо понять, почему GUID не работает, но в этом случае жизнь просто слишком коротка, и альтернатива приемлема. Удачи всем, кто столкнется с подобной проблемой в будущем.

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