2015-11-23 4 views
0

У меня есть три таблицы, определенные jpa: «континент», «страна» и «регион». У них есть отношения целой части, т.е. страна не может существовать без континента. Поэтому я смоделировал классы для континента и страны, а весной генерироваться DDL отлично, все работает:Определение проблемы JPA с 3 таблицами и составными первичными ключами

@Entity 
public class Continent { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Short id; 
//[..] 
} 

@Entity 
public class Country implements Serializable { 

    private static final long serialVersionUID = -6825504967607930373L; 

    @Id 
    @ManyToOne 
    @JoinColumn(name="continent_id") 
    private Continent continent; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Short id; 
//[..] 
} 

Но если добавить регион, я не знаю, как определить отношение без спящего режима дает мне ошибку во время инициализации (см. ниже).

@Entity 
public class Region { 

    @Id 
    @ManyToOne 
    @JoinColumns({ 
//  @JoinColumn(name="continent_id"), 
     @JoinColumn(name="country_id") 
    }) 
    private Country country; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    Short id; 

//[..] 
} 

Это определение дает мне ошибку

Caused by: org.hibernate.MappingException: Foreign key (FK_otariwhls1krq0bo780jtvbqn:region [country_id])) must have same number of columns as the referenced primary key (country [id,continent_id]) 
at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:110) 

, но если я удалю, // из continent_id присоединиться к колонке я получаю эту ошибку вместо:

Caused by: org.hibernate.AnnotationException: A Foreign key refering com...Country from com...bo.Region has the wrong number of column. should be 1 
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:502) 

Что я делаю неправильно ? Я использую Hibernate 4.3.11 final на mysql в среде Springboot 1.3.

ответ

0

Используйте только @JoinColumn(name="country_id") wihtout @JoinColumns (обратите внимание на множественное число) и удалите @Id с Region.country.

+0

Это все еще дает ошибку «Внешний ключ (FK_otariwhls1krq0bo780jtvbqn: region [country_id])) должен иметь такое же количество столбцов, что и ссылочный первичный ключ (страна [id, continent_id])», если страна определена только как «@ManyToOne \t @JoinColumn (name = "country_id") \t частная страна страны; " – RookieGuy

+0

Также удалите из аннотации 'Country.continent'' @ Id'. –

+0

Это заставляет проблему уйти, но у меня больше нет основной ключевой части на континенте. "Убывание страна" в базе данных возвращает этот результирующий: ID SMALLINT (6) \t \t NO PRI \t \t auto_increment/имя \t VARCHAR (255) \t \t ДА/continent_id \t SMALLINT (6) \t \t ДА MUL \t Перед удалением @Id из страны он определил составной первичный ключ. – RookieGuy

 Смежные вопросы

  • Нет связанных вопросов^_^