2011-08-11 44 views
0

我有一个实体,其ID是在SQL Server数据库中生成的GUID(它是我无法更改模式的第三方数据库),因此字段被定义;尝试检索插入的行时插入失败

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

当我创建一个新的实体,并保存它时,ID首先正确地GUIDGenerator调用NEWID()产生,则该行被使用所生成的ID作为参数值插入。然而,在插入之后,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值”,这很有意义。

回答

0

我永远无法达到这个底部,但幸运的是,我错误地认为这是一个第三方数据库,它给了我这个问题,实际上模式是在我们的控制之下。

只需将表上的主键更改为BIGINT(设置为标识列)并将实体标识的数据类型更改为Long,就可以重新运行测试代码,并且实体可以正确持久保存到数据库。一切按预期工作,我可以停止撕毁我的听到和发誓。

如果想深入了解GUID不起作用的原因,但在这种情况下,生活太短暂了,而且可以接受。对未来碰到类似问题的任何人都好运。