2014-11-30 8 views
10

mam mapowanie moje zajęcia z tabelami mojej bazy danych, ale kiedy uruchomiony test, pojawia się następujący błąd:AnnotationException: Odwołanie do klucza obcego ma niepoprawną liczbę kolumn. powinno być 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 

to są moje zajęcia:

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

oba mają klucze podstawowe są osadzone w klasach.

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

a to mój relacyjnej bazy danych modelu

enter image description here

ktoś ma jakiś pomysł? z tego nie działa?

EDIT 30/11/2014 - Powrót do listy PUSTY STOWARZYSZENIE to moje testy JUnit

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

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

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

Jest to metoda, która zwraca mi skojarzenie Provincias

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

i to I mieć w bazie danych

enter image description here

enter image description here

Odpowiedz

18

Twoja klasa CiudadPK ma dwie kolumny. Używasz tylko @JoinColumn, która jest ograniczona do pojedynczej kolumny. Musisz użyć @JoinColumns i wyświetlić obydwie kolumny w FK, np.

// 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ędziesz prawdopodobnie mają inny problem w/Ciudad jak dobrze, należy wykonać wzór, żeby poprawić ten jeden.

+0

Dzięki, zadziałało !, ale mam wątpliwości, ponieważ potrzebuję dwóch obcych kluczy, jeśli mój stół ma tylko jeden? Jest to coś, czego nie zrozumiałem. –

+0

Otrzymujesz złożony klucz podstawowy, ponieważ używasz '@ EmbeddedId' w kodzie. Czy to nie była twoja intencja? –

+0

gdyby tak było, wprawiło mnie w zakłopotanie, ale oświeciłeś mnie i zrozumiałem. w przeciwnym razie, ponieważ teraz próbuję zwrócić listę REGION asociasones w klasie, ale zwracam pustą listę, wiesz dlaczego to jest ?. Edytowałem post z informacjami na ten temat –

Powiązane problemy