2009-11-12 13 views
6

Estoy tratando de agregar una clave primaria compuesta a una clase y tener un poco de problemas. Aquí están las clases.@IdClass con no primitivo @Id

class User { 
    private long id; 
    ... 
} 

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

estoy usando el orm.xml para mapear las clases porque son en realidad parte de una API de alto nivel que yo no quiero depender de APP - que tiene una serie de implementaciones.

Aquí está:

... 
<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> 

Por último, para hacer que todo funcione, he creado la clase TokenPK y se ve así:

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; 
    } 
} 

El problema que estoy teniendo es que Hibernate está compilando que no puede crear las tablas de mysql porque 'columna' de BLOB/TEXT 'usuario' se utiliza en la especificación de clave sin una longitud de clave '.

Mi problema es que las columnas se están almacenando como BLOB en primer lugar. Hasta que puse la clase de identificación, estaba funcionando bien, el usuario estaba vinculado a través de su id. ¿Cómo puedo hacer que Hibernate use el valor largo para la identificación del usuario que estaba usando como clave principal?

orm.xml Actualizado:

<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> 

Respuesta

2

definir la clave compuesta con String series y int userId, y especificar un ID de unirse a-columna para el usuario en emergencia. Creo que también deberás agregar 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

He intentado esto y me da un error 'org.hibernate.AnnotationException: No es posible encontrar propiedades (identificador de usuario) en la entidad con anotada @IdClass: token' –

+0

añadir @Column (o mapa en XML como < columna) los campos en TokenPK – Bozho

+0

No estoy seguro de lo que quiere decir, he actualizado el orm.xml (ver arriba) y ahora me está dando 'org.hibernate.AnnotationException: @Column (s) no permitido en un @ Propiedad ManyToOne: Token.user' –