2014-11-30 6 views
10

मैं अपने डेटाबेस की टेबल के साथ मेरी कक्षाओं मानचित्रण रहा हूँ, लेकिन जब एक परीक्षण चल रहा होना चाहिए, मैं निम्नलिखित त्रुटि मिलती है:एनोटेशन अपवाद: एक विदेशी कुंजी रिफायरिंग में कॉलम की गलत संख्या है। 2

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

दोनों है:

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 

ये मेरे वर्ग हैं प्राथमिक कुंजी कक्षाओं में एम्बेडेड हैं।

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

और यह मेरा संबंधपरक मॉडल डेटाबेस

enter image description here

किसी को भी किसी भी विचार है? इसमें से काम नहीं करता है?

संपादित 30/11/2014 - खाली एसोसिएशन सूची पर वापस जाएँ यह मेरा JUnit परीक्षण है

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

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

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

इस विधि है कि मुझे provincias

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

और इस मैं के सहयोग देता है डेटाबेस में

enter image description here

enter image description here

उत्तर

18

आपकी कक्षा CiudadPK में दो कॉलम हैं। आप केवल @JoinColumn का उपयोग कर रहे हैं जो एक ही कॉलम तक सीमित है। आपको @JoinColumns का उपयोग करने की आवश्यकता है और एफके में दोनों कॉलम सूचीबद्ध करें, उदा।

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

आप अन्य मुद्दा डब्ल्यू/Ciudad रूप में अच्छी तरह, यहाँ पैटर्न का पालन करें दूर करने के लिए है कि एक है संभावना करेंगे।

+0

धन्यवाद, यह काम करता है!, लेकिन मुझे संदेह है, क्योंकि अगर मेरी तालिका में केवल एक है तो मुझे दो विदेशी कुंजी की आवश्यकता है? यह कुछ है जो मुझे –

+0

समझा नहीं गया है आपको एक समग्र प्राथमिक कुंजी मिल रही है क्योंकि आप अपने कोड में '@ एम्बेडेड आईडी 'का उपयोग कर रहे हैं। क्या यह तुम्हारा इरादा नहीं था? –

+0

अगर यह था, तो मुझे भ्रमित कर दिया था, लेकिन आप मुझे प्रबुद्ध करते हैं और मैं समझ गया। अन्यथा अन्यथा, क्योंकि अब मैं वर्ग में श्रेणी क्षेत्र के रूप में सूची को वापस करने का प्रयास करता हूं, लेकिन मैं एक खाली सूची देता हूं, आपको पता है कि वह क्यों है? मैंने इस पोस्ट को –

संबंधित मुद्दे