2014-11-30 5 views
10

ich meine Klassen am Mapping mit den Tabellen meiner Datenbank, aber wenn ein Test ausgeführt wird, erhalte ich folgende Fehlermeldung:AnnotationException: Ein Fremdschlüssel verweist auf die falsche Spaltennummer. sollte 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 

das sind meine Klassen:

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

beide haben Primärschlüssel sind in Klassen eingebettet.

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

und das ist mein Beziehungsmodell-Datenbank

enter image description here

jemand eine Idee? davon funktioniert nicht?

EDIT 30/11/2014 - RETURN LEER ASSOCIATION IN LISTE dies ist meine JUnit-Test

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

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

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

Dies ist die Methode, die mir die Assoziation von provincias

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

und das ich zurück haben in der Datenbank

enter image description here

Antwort

18

Ihre Klasse CiudadPK hat zwei Spalten. Sie verwenden nur , die auf eine einzelne Spalte beschränkt ist. Sie müssen @JoinColumns verwenden und beide Spalten im FK auflisten, z.

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

Sie müssen wahrscheinlich die andere Frage w/Ciudad auch, dass man korrigieren Sie bitte hier, um das Muster folgen.

+0

Danke, es hat funktioniert!, Aber ich habe Zweifel, weil ich zwei Fremdschlüssel benötigt, wenn mein Tisch nur einen hat? Es ist etwas, was ich nicht verstanden habe –

+0

Sie erhalten einen zusammengesetzten Primärschlüssel, weil Sie eine '@ EmbeddedId' in Ihrem Code verwenden. War das nicht deine Absicht? –

+0

wenn es war, hatte mich verwirrt, aber Sie erleuchten mich und ich verstand. sonst, weil ich jetzt versuche, die Liste REGION asociasones in der Klasse zurückgeben, aber ich gebe eine leere Liste zurück, Sie wissen, warum ist das ?. Ich habe die Post mit Informationen über diese –

Verwandte Themen