2 个实体 House 和 City 以及数据库的屏幕截图。现在我意识到我没有完全正确地连接它,因为当用户提出请求时,他需要输入城市的号码,而不是名称,这是不正确的。如何正确绑定,以便在发生请求时将城市名称添加到 House 并链接到 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;
}
房子
@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;
}
您需要通过 id 链接数据库中的实体(极少数例外)。它从哪里来
id
,比如说,创建House
这个是另一个问题,现在我们将考虑它。实际上,通常用户不输入
id
,因为它不方便。但在文本字段中设置城市名称也不是用户友好的,他们不会那样做。例如,如果用户打错字,会发生什么?重要的是用户没有指定任意城市。如果
House
到城市的链接存储在(直接或通过中间表 - 没关系)中,则用户从现有城市中进行选择。在实践中,这意味着系统为用户提供了城市选择。这可以是下拉列表,也可以是确认选择的增量搜索,或者再次确认选择的按标准搜索。这里重要的是,用户在 UI 中可以看到城市的确切名称,原则上该城市可供选择。有了这个选择,程序使用
id
选定的城市来创建House
.因此,具体实现取决于您在 UI 中使用的内容。在数据库、服务甚至 MVC 控制器中,您需要使用
id
.