У меня есть три таблицы, определенные 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.
Это все еще дает ошибку «Внешний ключ (FK_otariwhls1krq0bo780jtvbqn: region [country_id])) должен иметь такое же количество столбцов, что и ссылочный первичный ключ (страна [id, continent_id])», если страна определена только как «@ManyToOne \t @JoinColumn (name = "country_id") \t частная страна страны; " – RookieGuy
Также удалите из аннотации 'Country.continent'' @ Id'. –
Это заставляет проблему уйти, но у меня больше нет основной ключевой части на континенте. "Убывание страна" в базе данных возвращает этот результирующий: 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