Связь двух сущностей Hibernate через строковое поле
Есть 2 сущности: страна(имя, код) и город(имя, код, код страны). Как hibernate объяснить что поле 'код страны' в сущности 'город' это внешний ключ на 'код' в сущность 'странa'. Все поля строковые. Заполняются через JSON.
@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
public class City {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String code;
@JsonAlias("country_code")
private String countryCode;
@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
public class Country {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String code;
private String name;
Ответы (2 шт):
Автор решения: Arch
→ Ссылка
Создать поле в классе Country:
@OneToMany
List<City> cities;
В классе City:
@ManyToOne
Country country;
При этом есть аннотация @JoinColumn, которая добавит id страны для каждой строки City.
Но у вас не указан маппинг к таблице, то есть для какого поля нужно добавить @Column
Автор решения: Kostya
→ Ссылка
В чистом виде как вы хотите сделать не получится, всё-таки мы работаем с объектами.
Для cвязи не по первичному ключу:
@Entity
public class Country implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NaturalId
@Column(unique = true, nullable = false)
private String code;
@Column(unique = true, nullable = false)
private String name;
@OneToMany(mappedBy = "country", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<City> cities = new ArrayList<>();
}
@Entity
public class City {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@NaturalId
@Column(unique = true, nullable = false)
private String code;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(
name = "country_code",
referencedColumnName = "code"
)
private Country country;
}
Для JSON можно добавить:
@JsonUnwrapped
@JsonIgnoreProperties({ "id", "name", "cities" })
private Country country;