2009-11-12 28 views
6

Sto provando ad aggiungere una chiave primaria composita a una classe e con un po 'di problemi. Ecco le classi.@IdClass con non primitivo @Id

class User { 
    private long id; 
    ... 
} 

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

Sto utilizzando l'orm.xml per mappare le classi perché sono in realtà parte di un'API di livello superiore che io non voglio dipendere da APP - ha un certo numero di implementazioni.

Eccolo:

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

Infine, per far funzionare il tutto, ho creato la classe TokenPK e sembra che questo:

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

Il problema che sto avendo è che Hibernate sta completando il fatto che non è possibile creare le tabelle mysql perché 'utente BLOB/TEXT' colonna 'utilizzato nelle specifiche chiave senza una lunghezza della chiave'.

Il mio problema è in realtà che le colonne vengono memorizzate come BLOB in primo luogo. Fino a quando ho inserito la classe id in esso funzionava perfettamente, l'utente era collegato tramite il suo id. Come posso fare in modo che Hibernate usi il valore lungo per l'id dell'utente che stava usando come chiave primaria?

orm.xml Aggiornato:

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

risposta

2

Definire la chiave composita con String series e int userId, e specificare un join-colonna ID per l'utente in token. Penso che dovrai aggiungere 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

Ho provato questo e ottengo un errore 'org.hibernate.AnnotationException: Impossibile trovare immobili (UserID) in entità annotate con @IdClass: token' –

+0

aggiungere @Column (o una mappa in XML come < colonna) i campi in TokenPK – Bozho

+0

Non sono sicuro di cosa intendi, ho aggiornato il file orm.xml (vedi sopra) e ora mi fornisce 'org.hibernate.AnnotationException: @Column (s) non consentito su un @ Proprietà ManyToOne: Token.user' –