2014-11-30 15 views
10

Tôi đang lập bản đồ các lớp học của tôi với các bảng của cơ sở dữ liệu của tôi, nhưng khi chạy một kiểm tra, tôi nhận được thông báo lỗi sau:Chú thích Ngoại lệ: Tham chiếu khóa ngoài có số cột sai. nên 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 

đây là những lớp học của tôi:

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

cả hai đều có các khóa chính được nhúng vào các lớp.

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

và đây là mô hình cơ sở dữ liệu quan hệ của tôi

enter image description here

ai có bất kỳ ý tưởng? điều đó không hiệu quả?

EDIT 30/11/2014 - Trở về danh sách EMPTY HIỆP HỘI đây là thử nghiệm JUnit tôi

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

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

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

Đây là phương pháp mà trả về cho tôi sự kết hợp của Provincias

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

và tôi này có trong cơ sở dữ liệu

enter image description here

enter image description here

Trả lời

18

Lớp học của bạn CiudadPK có hai cột trong đó. Bạn chỉ sử dụng @JoinColumn được giới hạn trong một cột. Bạn cần sử dụng @JoinColumns và liệt kê cả hai cột trong FK, ví dụ:

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

Bạn rất có thể sẽ có vấn đề khác w/Ciudad là tốt, hãy làm theo các mô hình ở đây để sửa chữa một đó.

+0

Cảm ơn, nó đã hoạt động !, nhưng tôi nghi ngờ, vì tôi yêu cầu hai khóa ngoại nếu bảng của tôi chỉ có một? Đó là điều tôi chưa hiểu –

+0

Bạn đang nhận được khóa chính kết hợp vì bạn đang sử dụng '@ EmbeddedId' trong mã của mình. Đây có phải là ý định của bạn không? –

+0

nếu nó đã, đã nhầm lẫn tôi, nhưng bạn soi sáng cho tôi và tôi hiểu. nếu không, bởi vì bây giờ tôi cố gắng trả về danh sách các Asociasones REGION trong lớp, nhưng tôi trả về một danh sách trống, bạn biết tại sao lại như vậy ?. Tôi đã chỉnh sửa bài đăng với thông tin về điều này –

Các vấn đề liên quan