java - 如何在保存 "parent"实体时保留 "child"实体?

标签 java hibernate orm hibernate-mapping cascade

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

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

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

CarDescription carDescription = ConvertDTO.convertCarDescription(carDescriptionDto);

session.save(carDescription);

如果此时 carDescription 没有设置 Car,我如何确保创建一个新的 Car 条目?或者这是我不希望 Hibernate 为我做的事情?

汽车.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;

    // ..
}

最佳答案

这不是好的做法。你不应该级联 entity state transitions来自 Child to Parents .

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

流程将是这样的:

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 在填充传入数据之前与当前 session 相关联。仅仅调用 persist 不会触发数据库行插入,因为它需要刷新。如果您在填充数据之前不发出任何查询,则实体将仅被安排刷新并在事务提交时传播到数据库。

关于java - 如何在保存 "parent"实体时保留 "child"实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31267214/

相关文章:

java - 在 Java 中使用 instanceof 对性能的影响

java - Android GameHelper 排行榜关闭监听器/检测器

java - OneToMany、ManyToOne 为什么子级中的父级值为空?

php - 如何在 Laravel 关系中实现 SUM()?

java - 如何将hibernate注解应用到抽象类的子类上

Java设置VideoCapture.set(CAP_PROP_FOURCC,编解码器值)

java - 《Effective Java》一书中的问题(Joshua Bloch)

java - 如何在数据库触发器创建 id 时禁用生成器

java - 使用 Hibernate 的代码优先方法

node.js - 在 Sails.JS 中持久化之前添加缺少的请求参数