2009-11-12 2 views
6

클래스에 복합 기본 키를 추가하려고하는데 문제가 있습니다. 다음은 수업입니다. @IdClass with non-primative @Id

class User { 
    private long id; 
    ... 
} 

class Token { 
    private User user; 
    private String series; 
    ... 
} 

나는 실제로 내가 JPA에 의존하지 않으려는 높은 수준의 API의 일부이기 때문에 클래스를 매핑 할 orm.xml을 사용하고 있습니다 - 그것은 구현을 가지고 있습니다. 여기

그것이 :

마지막으로
... 
<entity class="User"> 
    <attributes> 
     <id name="id"> 
      <generated-value strategy="AUTO"/> 
     </id> 
     ... 
    </attributes> 
</entity> 

<entity class="Token"> 
    <id-class class="TokenPK"/> 
    <attributes> 
     <id name="series"/> 
     <id name="user"/> 
     <many-to-one name="user"/> 
    </attributes> 
</entity> 

는 모든 작업을하기 위해, 나는 TokenPK 클래스를 만들었습니다 그리고는 다음과 같습니다

public class TokenPK implements Serializable { 

    private String series; 
    private User user; 

    public TokenPK() { 
    } 

    public TokenPK(String series, User user) { 
     this.series = series; 
     this.user = user; 
    } 

    public String getSeries() { 
     return series; 
    } 

    public void setSeries(String series) { 
     this.series = series; 
    } 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     RememberMeTokenPK that = (TokenPK) o; 

     if (!series.equals(that.series)) return false; 
     if (!user.equals(that.user)) return false; 

     return true; 
    } 

    @Override 
    public int hashCode() { 
     int result = series.hashCode(); 
     result = 31 * result + user.hashCode(); 
     return result; 
    } 
} 

나는 데 문제가 있다는 것입니다 Hibernate는 'BLOB/TEXT 컬럼'사용자 '가 키 길이없이 키 명세에서 사용 되었기 때문에 mysql 테이블을 생성 할 수 없다는 사실에 만족하고있다.

제 문제는 실제로 열이 처음에 BLOB로 저장된다는 것입니다. 내가 id 클래스를 넣을 때까지는 잘 작동했지만 사용자는 id를 통해 링크되었습니다. Hibernate가 기본 키로 사용하고있는 사용자의 ID에 긴 값을 사용하게하려면 어떻게해야합니까?

업데이트 orm.xml :

<entity class="Token"> 
    <id-class class="TokenPK"/> 
    <attributes> 
     <id name="series"/> 
     <id name="user"> 
      <column name="userId"/> 
     </id> 
     <many-to-one name="user"> 
      <join-column name="userId" insertable="false" updatable="false"/> 
     </many-to-one> 
    </attributes> 
</entity> 

답변

2

String seriesint userId와 복합 키를 정의하고 토큰의 사용자에 대한 조인 열 ID를 지정합니다. 나는 또한 당신이 insertable = "false", updatable = "false"를 추가해야한다고 생각한다.

<composite-id name="TikenPK" class="yourpackage.TokenPK"> 
     <key-property name="series" column="series" type="string" /> 
     <key-property name="userId" column="userId" type="integer"/> 
     </composite-id> 
+0

나는이 시도하고 나는 org.hibernate.AnnotationException 오류'얻을 : @IdClass로 주석 개체의 속성 (사용자 ID) 찾을 수 없습니다 : Token'이 –

+0

@Column을 추가 (또는 XML로지도를 < column) TokenPK의 필드 – Bozho

+0

orm.xml을 업데이트했는데 (위 참조) org.hibernate.AnnotationException : @Column이 @ ManyToOne 속성 : Token.user' –