【问题标题】:Why isn't my OneToMany List filled when persisting a JoinTable Object?持久化 JoinTable 对象时,为什么我的 OneToMany 列表未填充?
【发布时间】:2015-04-24 13:03:38
【问题描述】:

我正在开发一个休眠项目,并且我在 Car 和 CarDriver 之间建立了 @ManyToMany 关系。问题是这种关系也有属性,所以我使用了一个单独的实体,连接到 Car 和 CarDriver,这个实体称为 CarUsage。

我的问题是当我持久化一个 CarUsage 对象时,Car 和 CarDriver 中的 CarUsage 列表没有填充这个新对象。

这是我的实体:

汽车:

@Entity
@Table(name = "car")
@Inheritance(strategy = InheritanceType.JOINED)
public class Car extends BaseEntity {

@Column(name = "registration_plate")
private String registrationPlate;

@OneToMany(mappedBy="car")
private List<CarUsage> carUsages;

public String getRegistrationPlate() {
    return registrationPlate;
}

public void setRegistrationPlate(String registrationPlate) {
    this.registrationPlate = registrationPlate;
}

public List<CarUsage> getCarUsages() {
    return carUsages;
}

public void setCarUsages(List<CarUsage> carUsages) {
    this.carUsages = carUsages;
}
}

汽车司机

@Entity
@Table(name="car_driver")
public class CarDriver extends BaseEntity {

@OneToMany(mappedBy="carDriver")
private List<CarUsage> carUsages;

public List<CarUsage> getCarUsages() {
    return carUsages;
}

public void setCarUsages(List<CarUsage> carUsages) {
    this.carUsages = carUsages;
}
}

还有我的 JoinTable CarUsage:

@Entity
@Table(name = "car_usage")
public class CarUsage extends BaseEntity {

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "car_id")
private Car car;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "car_driver_id")
private CarDriver carDriver;
@Column(name = "start_date")
private Date startDate;
@Column(name = "end_date")
private Date endDate;
@Column(name = "active", nullable = false)
private boolean active;

public Car getCar() {
    return car;
}

public void setCar(Car car) {
    this.car = car;
}

public CarDriver getCarDriver() {
    return carDriver;
}

public void setCarDriver(CarDriver carDriver) {
    this.carDriver = carDriver;
}

public Date getStartDate() {
    return startDate;
}

public void setStartDate(Date startDate) {
    this.startDate = startDate;
}

public Date getEndDate() {
    return endDate;
}

public void setEndDate(Date endDate) {
    this.endDate = endDate;
}

public boolean isActive() {
    return active;
}

public void setActive(boolean active) {
    this.active = active;
}
}

当我持久化新的 CarUsage 时,Car 和 CarDriver 中的列表不会更新。

CarUsage carUsage = carUsageCreator.makeCarUsage(companyCar, carDriver, new Date(), new Date(), true);
    carUsageDao.persist(carUsage);

有谁知道我做错了什么?

【问题讨论】:

    标签: java hibernate jpa one-to-many many-to-one


    【解决方案1】:

    尝试使用 JPA/Hibernate 级联:

    选择关系的所有者方

    汽车 > CarUsage > CarDriver 或 CarDriver > CarUsage > 汽车。

    如果CarDriver是车主方,映射应该是

    @OneToMany(mappedBy="carDriver",cascade = CascadeType.ALL, orphanRemoval = true)
    private List<CarUsage> carUsages;
    

    要创建一个新的 carUsage 关系,您可以创建一个类似这样的方法:

    public void driveCar(CarDriver carDriver, Car car){
        CarUsage carUsage = new CarUsage(carDriver, car, Date()....)
        carDriver.getCarUsages().add(carUsage);
        car.getCarUsages().add(carUsage);// Just to maintain coherence for the rest of the current transaction
          ...
    }
    

    如果您在事务中,此代码将自动持久化 carUsage 实例。 (不再需要 carUsageDao.persist(carUsage))..

    【讨论】:

    • 不幸的是,这并没有完成这项工作,我想我希望 hibernate 会为我完成所有工作并填写该列表,但现在我将自己以另一种方式完成。谢谢你的回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2015-07-19
    • 2017-01-02
    相关资源
    最近更新 更多