2011-01-24 13 views
2

Hibernateの動作がNHibernateの動作と異なるかどうかを調べるために、NHibernateベースのアプリケーションの関連部分のJava SE & Hibernateポートを作成し始めました。エンティティで、対応するSQL Server 2008 R2 Expressテーブルでプライマリキーにuniqueidentifierが使用されています。uniqueidentifier主キーを持つエンティティを取得する問題

ここでは、マッピング・ファイルです:問題は、セッション#への呼び出しがリターンを得ることである

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 

SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); 
Session session = sessionFactory.openSession(); 
User currentUser = (User) session.get(User.class, UUID.fromString("473D248D-8D91-41C9-BD73-8ACA45539D79")); 

<!-- User.hbm.xml --> 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="hibernatetest.entity.User" table="aspnet_Users"> 
    <id name="Id"> 
     <column name="UserId" sql-type="uniqueidentifier" not-null="true" /> 
    </id> 
    <!-- ... --> 

と、対応するPOJOの定義:

// hibernatetest/entity/User.java 
package hibernatetest.entity; 

import java.util.UUID; 

public class User { 
    private UUID id; 

    public UUID getId() { 
     return id; 
    } 

    public void setId(UUID id) { 
     this.id = id; 
    } 
    //... 

そしてメインコードnull、プライマリキーのユーザエンティティが見つからないため。

私は完全なログを有効にすると、私は次を参照してください。

DEBUG [main] (AbstractBatcher.java:401) - select user0_.UserId as UserId0_0_ from aspnet_Users user0_ where user0_.UserId=? 
Hibernate: select user0_.UserId as UserId0_0_ from aspnet_Users user0_ where user0_.UserId=? 
TRACE [main] (NullableType.java:133) - binding '2c6d8085f3f2808eeae1f6e1aef5f4e9ecaed5d5c9c43c19837718ed05af828082ca808cece5e1f3f4d3e9e7c2e9f4f3ca808bedeff3f4d3e9e7c2e9f4f3f8f03df30a4ac5d31df9c7bda40d0d11c149' to parameter: 1 

私はHibernateは値'2c6d8085f...を導出が、これは私が期待することを結合値ではなく、それからユーザエンティティを防ぐ方法がわかりません位置している。

私は、この行は実体を見つけることに成功し、Stringjava.util.UUIDからhibernatetest.entity.Useridフィールドの種類を変更する場合:

User currentUser = (User) session.get(User.class, "473D248D-8D91-41C9-BD73-8ACA45539D79"); 

、ログ出力は次のようになります。

どう
DEBUG [main] (AbstractBatcher.java:401) - select user0_.UserId as UserId0_0_ from aspnet_Users user0_ where user0_.UserId=? 
Hibernate: select user0_.UserId as UserId0_0_ from aspnet_Users user0_ where user0_.UserId=? 
TRACE [main] (NullableType.java:133) - binding '473D248D-8D91-41C9-BD73-8ACA45539D79' to parameter: 1 

HibernateはUUID '473D248D-8D91-41C9-BD73-8ACA45539D79'のためにバインドする値'2c6d8085f...を計算しましたか?代わりに、実際のUUID値を代わりにバインドさせることができますか?

答えて

6

Java UUIDjava.util.UUID)とSQL Server uniqueidentifierの2種類があります。あなたは、Hibernateに2つの間のマッピングを指示しています。私はHibernateが何かを何でもすることができることに驚いています。そして、生成するものが非常に奇妙であることに驚くことはありません。

私が知っている限り(SQL Serverで多くのことをしないでください)、Hibernateはプレーンな古いString列としてuniqueidentifierを扱います。そのため、おそらく最善の策は、それを文字列にマップすることです。あなたはまだあなたがプロパティベースのマッピングをやっている場合だけで、HibernateはUUIDフィールドは一時フィールドであることを知っているし、保存しようとしないの両方のことを確認してください

public UUID getUUID() { 
    return UUID.fromString(id); 
} 

public void setUUID(UUID val) { 
    id = val.toString(); 
} 

...など getUUID()setUUID()を持つことができますIDとUUID。

SQLサーバーには、Java UUIDとの変換が可能なJavaで使用できる特殊なUUIDクラスがあります。また、Hibernateのいくつかの新しいバージョンがjava.util.UUIDをSQL ServerのUUIDにマッピングするためのサポートを出している可能性もありますが、これらの可能性はどちらも当てはまりません。

編集:問題をさらに調べた後、私はあなたの混乱の一部を見ることができます。NHibernateは実際にSystem.GUIDからSQL Serverのuniqueidentifierに変換されているように見えます(両方ともMicrosoftから関係しているので意味があります)。しかし、私はHibernate同等物があるとは思わない。

2

私は同じ問題を抱えていましたが、私はuuid-charタイプを列に追加して解決しました。

<!-- User.hbm.xml --> 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http //www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="hibernatetest.entity.User" table="aspnet_Users"> 
     <id name="Id" type="uuid-char"> 
      <column name="UserId" sql-type="uniqueidentifier" not-null="true" /> 
     </id> 
<!-- ... --> 
+0

注釈@Type(type = "uuid-char") ' – sMaN

関連する問題