【问题标题】:Problem with relation @ManyToOne in Spring Boot, Hibernate, JPASpring Boot,Hibernate,JPA中关系@ManyToOne的问题
【发布时间】:2021-06-15 15:02:22
【问题描述】:

我有课 -> 国家和城市。

  1. 我想创建作品请求,当我调用获取所有国家/地区时,我将获取所有国家/地区,以及城市。
  2. 当我调用获取所有城市时,我会从 Country 模型中获取仅包含国家/地区的所有城市。
  3. 我想添加与国家/地区相关的新城市。

我的国家模型班:

  @GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private Long id;

@NotEmpty(message = "Name of country is mandatory.")
@Column(unique = true)
private String nameOfCountry;

@NotBlank(message = "Name of capital is mandatory.")
private String capital;

@Max(value = 17098242L, message = "Maximum value for population = 10000000000")
private Long surface;

private String countryCode;

private String telephoneCode;

@OneToMany(cascade = CascadeType.PERSIST)
@JoinColumn(name = "country_Id", updatable = false, insertable = false)
private List<CityModelDao> cityModelDao;

我的城市模型类:

    @GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private Long id;

@NotEmpty(message = "Name of country is mandatory.")
@NotNull
@Column(nullable = false, unique = true)
private String nameOfCity;

我知道我这里没有@ManyToOne,但我仍然做错了,现在我没有更多的想法。

我在获取国家/地区的回复:

这就是我想要的。

但是当我打电话询问城市时,我的回答是:

很遗憾,我没有得到有关国家/地区的信息。

在数据库中,我有来自国家/地区的有关 fk 的城市信息:

你能帮我处理一下工作关系吗?我试过类似的东西:

城市模型:

    @ManyToOne()
@JoinColumn(name = "country_Id")
private CountryModelDao countryId;

国家型号:

    @OneToMany(mappedBy = "countryId", orphanRemoval = true, cascade = CascadeType.PERSIST)
private List<CityModelDao> cityModelDao;

但这是错误的。当我尝试使用上述关系城市时,我得到了错误。

您能告诉我在这种情况下如何正确处理@ManyToOne 吗?我做错了什么?

谢谢

【问题讨论】:

    标签: spring-boot hibernate jpa h2


    【解决方案1】:

    最简单的双向OneToMany关系模型应该是:

    @OneToMany(mappedBy = "countryId")
    private List<CityModelDao> cityModelDao;
    

    您将 Country 设置为 Country - City 关系的所有者; 您希望 CityModelDao 中有一个属性“countryId”;

    @ManyToOne
    @JoinColumn(name = "country_id")
    private CountryModelDao countryId;
    

    您将根据将在 CityModelDao 表中的 country_id 列上执行的连接操作填充数据。

    当然,之后你可以通过孤儿移除、级联类型等来丰富注解。

    乐: 您正在通过 REST 使用它,您需要避免无限循环。

    请将关系更新为:

    @JsonManagedReference
    @OneToMany(mappedBy = "countryId")
    private List<CityModelDao> cityModelDao;
    
    @JsonBackReference
    @ManyToOne
    @JoinColumn(name = "country_id")
    private CountryModelDao countryId;
    

    【讨论】:

    • 我在上面添加了对您代码的响应,因为它太长了,无法在评论中添加。
    • 我更新了我的答案,这样你就可以避免无限循环。
    猜你喜欢
    • 2016-03-08
    • 2017-11-10
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2023-04-09
    相关资源
    最近更新 更多