2011-01-24 3 views
2

Hibernate의 동작이 NHibernate의 for a particular usage scenario과 다른지를 조사하기 위해, Hibernate 포트를 Hibernate 포트로 작성하기 시작했다. 엔터티 (여기서 해당 SQL Server 2008 R2 Express 테이블은 기본 키에 uniqueidentifier을 사용합니다.)uniqueidentifier 기본 키를 가진 엔티티 획득 문제

<!-- 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; 
    } 
    //... 

그리고 주요 코드 : 여기

은 매핑 파일의

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")); 

문제는 세션 번호로 전화가 수익을 얻을 수 있다는 것입니다 null, 기본 키에 대한 사용자 엔터티를 찾지 못함. Hibernate가 값 '2c6d8085f...을 유도하는 방법

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 

나도 몰라, 그러나 이것은 내가 기대하는 것이 바인딩 값이 아닙니다, 그것은에서 사용자 개체를 방지 : 나는 전체 로깅을 사용하도록 설정하면

, 나는 참조 위치한다. 내가 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 

방법 최대 절전 모드에서 '2c6d8085f... 값을 계산하여 UUID '473D248D-8D91-41C9-BD73-8ACA45539D79'에 바인딩 했습니까? 대신 실제 UUID 값을 바인드 할 수 있습니까?

답변

6

Java UUID (java.util.UUID)과 SQL Server uniqueidentifier은 두 가지가 있습니다. 당신은 Hibernate에게 둘 사이의 매핑을 지시하고있다. 나는 Hibernate가 무엇이든 할 수 있다는 것에 놀랐다. 그리고 생성되는 것이 매우 이상하다는 것에 놀라지 않았다.

Hibernate는 평범한 오래된 String 열로 uniqueidentifier을 처리 할 것입니다. SQL Server에서 많은 작업을하지 않는 것이 가장 좋습니다. 따라서 최선의 방법은 아마 문자열을 매핑하는 것입니다. 당신은 여전히 ​​getUUID()하고 setUUID() ... 당신은 Hibernate가 UUID 필드가 과도 필드 알고 모두를 저장하지 않는 특성 기반 매핑을하고 있다면

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

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

그냥 확인을 가질 수 ID와 UUID.

SQL 서버에 자바 UUID로 변환 할 수있는 특별한 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