如何让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;
// ..
}
答案 0 :(得分:2)
这不是好习惯。您不应该从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);
这样,您可以在填充传入数据之前确保car
和carDescription
与当前会话相关联。只是调用persist不会触发数据库行插入,因为它需要刷新。如果在填充数据之前未发出任何查询,则只会在事务提交时调度实体以进行刷新并传播到数据库。
答案 1 :(得分:1)
有两种方法可以实现这一目标。
1)您可以在Car
字段初始值设定项中创建CarDescription
:
@NotNull
@ManyToOne(cascade = CascadeType.PERSIST)
private Car car = new Car();
您还可以定义CascadeType.PERSIST
,以便car
与其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);