2015-08-25 73 views
1

這裏是我的表:Hibernate的缺失列錯誤

CREATE TABLE IF NOT EXISTS `Jugadores` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '', 
    `nombre` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_spanish_ci' NOT NULL COMMENT '', 
    `apellidos` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_spanish_ci' NOT NULL COMMENT '', 
    PRIMARY KEY (`id`) COMMENT '' 
) 


CREATE TABLE IF NOT EXISTS `Acciones` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '', 
    `accion` INT UNSIGNED NOT NULL COMMENT '', 
    `idJugador` INT UNSIGNED NOT NULL COMMENT '', 
    PRIMARY KEY (`id`) COMMENT '', 
    CONSTRAINT `fk_acciones_jugadores_id` 
    FOREIGN KEY (`idJugador`) 
    REFERENCES `Jugadores` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 

這裏是我的Java類:

Jugador:

@Entity 
@Table(name ="Jugadores")  
public class Jugador{ 

     private int id; 
     private String nombre; 
     private String apellidos; 

     private Map<Integer, Accion> accionesJugador; 


     public Jugador() {} 

     /** 
     * @return the id 
     */ 
     @Override 
     @Id 
     @GeneratedValue 
     public int getId() { 
      return id; 
     } 

     /** 
     * @param id the id to set 
     */ 
     public void setId(int id) { 
      this.id = id; 
     } 

     /** 
     * @return the nombre 
     */ 
     public String getNombre() { 
      return nombre; 
     } 

     /** 
     * @param nombre the nombre to set 
     */ 
     public void setNombre(String nombre) { 
      this.nombre = nombre; 
     } 

     /** 
     * @return the apellidos 
     */ 
     public String getApellidos() { 
      return apellidos; 
     } 

     /** 
     * @param apellidos the apellidos to set 
     */ 
     public void setApellidos(String apellidos) { 
      this.apellidos = apellidos; 
     } 

     /** 
     * @return the accionesJugador 
     */ 
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "jugador") 
     @MapKey 
     public Map<Integer, Accion> getAccionesJugador() { 
      return accionesJugador; 
     } 

     /** 
     * @param accionesJugador the accionesJugador to set 
     */ 
     public void setAccionesJugador(Map<Integer, Accion> accionesJugador) { 
      this.accionesJugador = accionesJugador; 
     } 

    } 

Accion:

@Entity 
@Table(name = "Acciones") 
public class Accion { 

    private int id; 
    private int accion; 
    private Jugador jugador; 
    public Accion(){}; 

    @Override 
    @Id 
    @GeneratedValue 
    public int getId() { 
     return id; 
    } 

    /** 
    * @param id the id to set 
    */ 
    public void setId(int id) { 
     this.id = id; 
    } 

    /** 
    * @return the accion 
    */ 
    public int getAccion() { 
     return accion; 
    } 

    /** 
    * @param accion the accion to set 
    */ 
    public void setAccion(int accion) { 
     this.accion = accion; 
    } 

    /** 
    * @return the jugador 
    */ 
    @ManyToOne() 
    @JoinColumn(name = "idJugador") 
    public Jugador getJugador() { 
     return jugador; 
    } 

    /** 
    * @param jugador the jugador to set 
    */ 
    public void setJugador(Jugador jugador) { 
     this.jugador = jugador; 
    } 

和Hibernate的日誌說:

Initial SessionFactory creation failed.org.hibernate.HibernateException: Missing column: accionesJugador_KEY in HBAssistant.Acciones

編輯:Map<Integer, Accion> accionesJugador的關鍵是的 Accion

解決了這個ID:上面的代碼解決了我原來的問題

+0

聽起來像一個外鍵問題。是否有關於外鍵名稱的約定/限制? (我不知道冬眠) – m02ph3u5

+0

你想在Jugador有一個Map 。但是你還沒有告訴Hibernate地圖的關鍵應該是什麼。這是一個整數,但來自哪裏? –

+0

我已更新我的問題。地圖的關鍵是Accion的ID(數據是地圖中每個條目的值) – gutiory

回答

1

您在@OneToMany關係中使用地圖。

你需要給JPA的關鍵:

@MapKey 

如果密鑰ID不是主鍵字段

@MapKey(name = "something") 

在你的代碼:

 @OneToMany(cascade = CascadeType.ALL, mappedBy = "jugador") 
     @MapKey 
     public Map<Integer, Accion> getAccionesJugador() { 
      return accionesJugador; 
     } 
+0

我做了你的建議,並且出現了另一個錯誤:創建初始SessionFactory failed.org.hibernate.HibernateException:缺少列: acciones_KEY in HBAssistant.Acciones – gutiory

+0

其中是您的類Accion中字段「id」的聲明?你在這裏複製/粘貼錯過了什麼? – Pras

+0

我已更新我的問題。對不起,我錯了複製/粘貼。 – gutiory