Hibernate 尝试检索插入的行时,插入失败

Hibernate 尝试检索插入的行时,插入失败,hibernate,Hibernate,我有一个实体,其id是SQL Server数据库中生成的GUID(这是第三方数据库,我无法更改其架构),因此定义了字段 @Id @GenericGenerator(name="generator", strategy="guid", parameters = {}) @GeneratedValue(generator ="generator") @Column(name="FarmID") public String getId() { return id; } 创建并保存新实体时,首

我有一个实体,其id是SQL Server数据库中生成的GUID(这是第三方数据库,我无法更改其架构),因此定义了字段

@Id
@GenericGenerator(name="generator", strategy="guid", parameters = {})
@GeneratedValue(generator ="generator")
@Column(name="FarmID")
public String getId() {
    return id;
}
创建并保存新实体时,首先由调用newid()的GUIDGenerator正确生成id,然后使用生成的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错误大致翻译为“您不能使用空字符串作为唯一标识符值”,这很有道理。

我永远无法弄清这一点,但幸运的是,我错误地认为这是第三方db给了我这个问题,而事实上架构在我们的控制之下

只需将表上的主键更改为BIGINT(设置为identity columns)并将实体id的数据类型更改为Long,我就能够重新运行测试代码,并将实体正确地持久化到数据库中。一切都如期进行,我可以停止撕扯我的耳朵和咒骂

弄清guid不起作用的原因是很好的,但是在这种情况下,生命太短暂了,替代方案是可以接受的。祝将来遇到类似问题的人好运