2014-11-30 6 views
10

sto mappando le mie lezioni con le tavole di mio database, ma durante l'esecuzione di un test, ottengo il seguente errore:AnnotationException: un riferimento a chiave esterna ha il numero sbagliato di colonne. dovrebbe essere 2

Caused by: org.hibernate.AnnotationException: A Foreign key refering com.modulos.pvs.acceso.datos.entity.Provincia from com.modulos.pvs.acceso.datos.entity.Ciudad has the wrong number of column. should be 2 
    at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:429) 
    at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:115) 
    at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1550) 
    at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1473) 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1389) 
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1345) 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:717) 
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479) 
    ... 40 more 

queste sono le mie classi:

// PROVINCIA TABLE 
    @Entity 
    @Table(name="provincia") 
    @NamedQuery(name = "Provincia.findAll", query = "SELECT p FROM Provincia p") 
    public class Provincia implements Serializable { 

     private static final long serialVersionUID = 1L; 

     @EmbeddedId 
     private ProvinciaPK id; 

     private String nombreProvincia; 

     // bi-directional many-to-one association to Region 
     @ManyToOne(fetch=FetchType.LAZY) 
     @JoinColumn(name = "codRegion") 
     private Region region; 

     //bi-directional many-to-one association to Ciudad 
     @OneToMany(mappedBy="provincia", fetch=FetchType.LAZY) 
     private List<Ciudad> ciudad; 

    //GETTER AND SETTER 

//TABLE CIUDAD 
/** 
* The persistent class for the city database table. 
* 
*/ 
@Entity 
@Table(name="ciudad") 
@NamedQuery(name = "Ciudad.findAll", query = "SELECT c FROM Ciudad c") 
public class Ciudad implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private CiudadPK id; 

    private String nombreCiudad; 

    // bi-directional many-to-one association to Provincia 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name = "codProvincia", insertable = false, updatable = false) 
    private Provincia provincia; 

    //bi-directional many-to-one association to Direcciones 
    @OneToMany(mappedBy="ciudad", fetch=FetchType.LAZY) 
    private List<Direcciones> direcciones; 

// GETTER AND SETTER 

entrambi hanno le chiavi primarie sono incorporate nelle classi.

//PROVINCIA PK 
/** 
* The primary key class for the provincia database table. 
* 
*/ 
@Embeddable 
public class ProvinciaPK implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    private String codProvincia; 

    private String codRegion; 

    public ProvinciaPK() { 
    } 
    /getter and setter 

//ciudad pk 
/** 
* The primary key class for the region database table. 
* 
*/ 
@Embeddable 
public class CiudadPK implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    private String codCiudad; 

    private String codProvincia; 

    public CiudadPK() { 
    } 
//GETTER AND SETTER 

e questo è il mio database modello relazionale

enter image description here

Qualcuno ha qualche idea? di quello non funziona?

EDIT 30/11/2014 - Torna alla lista ASSOCIAZIONE VUOTO questo è il mio test JUnit

Region region = new Region(); 
      region.setId(new RegionPK("RM","CHL")); 

      region.setProvincias(regionDAO.getProvinciaRegion(region)); 

      System.out.println(region.getProvincias()); 

Questo è il metodo che mi restituisce l'associazione di Provincias

@Transactional(readOnly=true) 
@Override 
public List<Provincia> getProvinciaRegion(Region region) { 
    region = getRegionById(region); 
    Hibernate.initialize(region.getProvincias()); 
    return region.getProvincias(); 
} 

e questo lo avere nel database

enter image description here

enter image description here

risposta

18

La classe CiudadPK contiene due colonne. Stai utilizzando solo @JoinColumn che è limitato a una singola colonna. È necessario utilizzare @JoinColumns ed elencare entrambe le colonne nell'FK, ad es.

// bi-directional many-to-one association to Provincia 
@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumns({ 
    @JoinColumn(name = "codProvincia", insertable = false, updatable = false), 
    @JoinColumn(name = "codRegion", insertable = false, updatable = false) 
}) 
private Provincia provincia; 

è probabile che sia l'altra questione w/Ciudad così, si prega di seguire lo schema qui per correggere quello.

+0

Grazie, ha funzionato!, Ma ho un dubbio, perché ho bisogno di due chiavi esterne se il mio tavolo ne ha solo uno? È qualcosa che non ho capito –

+0

Stai ottenendo una chiave primaria composita perché stai usando un '@ EmbeddedId' nel tuo codice. Non era questa la tua intenzione? –

+0

se lo fosse, mi aveva confuso, ma tu mi illumini e ho capito. altrimenti, perché ora provo a restituire la lista delle asocias di REGION in classe, ma restituisco una lista vuota, sai perché è così ?. Ho modificato il post con informazioni su questo –

Problemi correlati