【问题标题】:Wrong usage of @OneToMany returns empty list [duplicate]@OneToMany 的错误使用返回空列表 [重复]
【发布时间】:2021-04-22 07:01:29
【问题描述】:

我有两个模型类:

拥有车主字段的汽车:

import lombok.Data;

import javax.persistence.*;

@Entity
@Data
public class Car {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String carBrand;
    private String modelOfCar;
    private String gearbox;
    private int yearProduction;
    private int mileage;
    private String status;
    @ManyToOne
    @JoinColumn(name = "owner_id")
    private Owner owner;
}

还有拥有汽车领域的所有者

@Entity
@Data
public class Owner implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nameOfOwner;
    private String surnameOfOwner;
    @OneToMany(mappedBy = "owner")
   
    private List<Car> cars = new ArrayList<>()
            
    public void addCarToOwner(Car car) {
        cars.add(car);
    }
}

我尝试将一些示例数据添加到该数据中的嵌入式 h2 DB:

    Car car1 = new Car();
    car1.setCarBrand("asd");
    car1.setModelOfCar("asd");
    car1.setGearbox("asd");
    car1.setYearProduction(22018);
    car1.setMileage(321000);
    car1.setStatus("Available");

    Car car2 = new Car();
    car2.setCarBrand("asd");
    car2.setModelOfCar("asd");
    car2.setGearbox("asd");
    car2.setYearProduction(2011);
    car2.setMileage(6801020);
    car2.setStatus("Available");

  Owner owner1 = new Owner();
    owner1.setNameOfOwner("asd");
    owner1.setSurnameOfOwner("asd");
    owner1.addCarToOwner(car1);

    Owner owner2 = new Owner();
    owner2.setNameOfOwner("asd");
    owner2.setSurnameOfOwner("asd");
    owner2.addCarToOwner(car2);

  carRepository.save(car1);
    carRepository.save(car2);
    ownersRepository.save(owner1);
    ownersRepository.save(owner2);

当我使用findAll() 方法检查所有者存储库的状态时,我得到所有者和他的汽车的空列表。当我为汽车存储库运行findAll() 时,我的所有者为空,因为我没有设置它,但是当所有者需要汽车并且汽车需要所有者时如何设置它?

owner repository

car repository

所有这些导致当我尝试获取具有给定 ID 的用户时,我得到一个空的汽车列表。

【问题讨论】:

  • 尝试实现一个 getCars 方法,该方法返回拥有的汽车列表,并查看它是否返回汽车列表。可能只是您的汽车阵列没有序列化。
  • @rakeshpan 仍然返回 0 结果。但我猜汽车也不应该将所有者设置为空
  • 你的一对多关系的拥有方是汽车,因为它的外键为“owner_id”,所以尝试创建汽车,创建所有者,制作方法来设置汽车的所有者并尝试通过汽车端建立关系。

标签: java spring-boot jpa spring-data-jpa one-to-many


【解决方案1】:

看起来您正在OwnerCar 之间创建一个双向OneToMany。在这种情况下,您需要同步关联的双方。

您的实用方法addCarToOwner 可以很好地做到这一点:

@Data
@Entity
public class Owner implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nameOfOwner;
    private String surnameOfOwner;
    @OneToMany(mappedBy = "owner")
    private List<Car> cars = new ArrayList<>()
    
    public void addCarToOwner(Car car) {
        car.setOwner(this);
        this.cars.add(car);
    }
}

通过将Owner 设置为Car,您可以同步关联的双方。

【讨论】:

  • 我应该先救车主而不是救车?因为现在我在车场上为车主获得了 stackoverflow
  • 你得到了无限递归,因为你试图序列化汽车,它有一个对所有者的引用,它有一个对汽车的引用,依此类推。您需要在序列化期间打破循环引用。例如,您使用 Jackson 序列化为 json,您可以使用 @JsonIgnore 注释来防止循环引用。
  • @rakeshpan 但我想显示在 JSON 车主的车中
  • 你只需要忽略一侧,@ManyToOne 上的 jsonignore 也是如此 @JoinColumn(name = "owner_id") private Owner owner;
  • @rakeshpan 我的意思是,它被忽略了,但是在调试时我得到了 stackoverflow,所以我认为它必须以某种方式解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多