Как связать многие ко многим не по ID
2 сущности House и City и скриншот БД. Сейчас понял, что не совсем корректно связал, потому что когда пользователь делает запрос, то ему необходимо вбивать цифру, а не название, города, что не является правильным. Как мне правильно связать, чтобы когда происходит запрос, то в House добавлялось название города и имело связи с City?
City
@Data
@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Table(name = "city", schema = "public")
public class City {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToMany(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST,
CascadeType.REFRESH
}, mappedBy = "city")
@ToString.Exclude
@EqualsAndHashCode.Exclude
@JsonIgnore
private Set<House> house;
@Column(name = "id_region", nullable = false)
private Integer id_region;
@Column(name = "name", nullable = false)
private String name;
}
House
@Data
@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Table (name = "house", schema = "public")
public class House {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "city_id")
private City city;
@OneToMany(mappedBy = "house")
private Set<Contract> contract;
@Column(name = "id_landlord", nullable = false)
private Long id_landlord;
@Column(name = "outside", nullable = false)
private String outside;
@Column(name = "rooms", nullable = false)
private Integer rooms;
@Column(name = "price", nullable = false)
private Double price;
@Column(name = "description", nullable = false)
private String description;
@Enumerated(value = EnumType.STRING)
@Column(name = "status")
private Status status;
}
Ответы (1 шт):
Связывать сущности в БД нужно (за редким исключением) по id. Откуда id возьмется в коде, который, скажем, создает House это другой вопрос, и сейчас его рассмотрим.
Действительно, обычно пользователь не вводит id, так как это неудобно. Но и задавать имя города в текстовом поле, тоже не дружественно к пользователю, и так не делают. Что будет, например, если пользователь сделает опечатку?
Важно то, что пользователь не задает произвольный город. Если в House хранится ссылка на город (прямо или через промежуточную таблицу - не важно), то пользователь выбирает из существующих городов.
На практике это значит, что система дает пользователю выбор города. Это может быть либо выпадающий список, либо инкрементный поиск с подтверждением выбора, либо поиск по критериям опять же с подтверждением выбора. Существенно тут то, что в UI пользователь видит точное название города, то что этот город в принципе доступен для выбора. При самом же выборе, программа использует id выбранного города, для создания House.
Поэтому конкретная реализация зависит от того, что у вас используется в UI. В БД, сервисе и даже MVC контроллере, нужно использовать id.
