繁体   English   中英

保存“子”实体时如何持久保存“父”实体?

[英]How to persist “parent” entity when saving a “child” entity?

我如何让Hibernate保存“ ”实体,例如,如果我有CarDescription来自客户端通过CarDescriptionDTO

如果我现在想要保存,例如

Session session = HibernateSession.openSession();
session.beginTransaction();

CarDescription carDescription = ConvertDTO.convertCarDescription(carDescriptionDto);

session.save(carDescription);

我怎样才能确保一个新的Car ,如果进入被创建carDescription没有Car组在这一点? 或者这是我不希望Hibernate为我做的事情?

Car.java

@Entity
@Table(name = "car")
public class Car extends AbstractTimestampEntity implements Serializable {
    private static final long serialVersionUID = -5041816842632017838L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    // ..
}

我怎样才能确保这也创建了一个Car条目?

CarDescription.java

@Entity
@Table(name = "car_description")
public class CarDescription extends AbstractTimestampEntity implements Serializable {
    private static final long serialVersionUID = 2840651722666001938L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @NotNull
    @ManyToOne
    private Car car;

    // ..
}

那不是好习惯。 您不应该将实体状态转换Child级联到Parent

更好的方法是在填充传入数据之前始终检查现有实体。

流程将如下所示:

Car car = session.get(Car.class, carId);
if(car == null) {
    car = new Car();
    session.persist(car);
}
CarDescription carDescription = session.get(CarDescription.class, carDescriptionId);
if(carDescription == null) {
    carDescription = new CarDescription();
    carDescription.setCar(car);
    session.persist(carDescription);
}

CarDescription carDescription = ConvertDTO.convertCarDescription(carDescriptionDto, car, carDescription);

这样,您可以确保在填充传入数据之前, carcarDescription与当前会话相关联。 只是调用persist不会触发数据库行插入,因为它需要刷新。 如果在填充数据之前未发出任何查询,则只会在事务提交时调度实体以进行刷新并传播到数据库。

有两种方法可以实现这一目标。

1)您可以在CarDescription的字段初始化程序中创建Car

@NotNull
@ManyToOne(cascade = CascadeType.PERSIST)
private Car car = new Car();

您还可以定义CascadeType.PERSIST以便将car与其CarDescription一起CarDescription 这样, CarDescription默认情况下将始终为空车

2)您可以明确创建和保存car

Session session = HibernateSession.openSession();
session.beginTransaction();

CarDescription carDescription = ConvertDTO.convertCarDescription(carDescriptionDto);

Car car = new Car();
carDescription.setCar(car);

session.save(car);
session.save(carDescription);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM