2011-08-11 11 views
0

idがSQL Server db(スキーマを変更できないサードパーティのデータベース)で生成されたGUIDであるため、フィールドが定義されている;私は新しいエンティティを作成し、それを保存すると挿入された行を取得しようとすると挿入が失敗する

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

、IDが最初に正しくNEWID()を呼び出す GUIDGeneratorによって生成され、その行は、パラメータ値として生成された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エラーは「空の文字列を一意識別子値として使用できません」という意味になります。

答えて

0

私は決してこれの底に到達することはできませんでしたが、運が良ければ、実際にはスキーマが制御されていたときに私にこの問題を与えていたサードパーティのデータベースだと誤って思っていました。

テーブルの主キーをBIGINT(ID列として設定)に変更し、エンティティIDのデータ型をLongに変更するだけで、テストコードを再実行でき、エンティティが正しく保持されました。データベース。すべてが期待通りに機能し、私は耳を傾けて誓うことを止めることができました。

なぜGUIDが機能していなかったのかを知ることができればうれしいですが、この例では人生は短すぎて代替案が受け入れられます。将来も同様の問題に立ち向かう人には最高の運があります。

関連する問題