【发布时间】:2012-03-12 16:27:42
【问题描述】:
我有一个基本的 Hibernate/JPA 问题。我想找到保存实体的最佳实践解决方案。我有一个实体列表,其中许多可能会被更改,所以我想一次保存它们。
我相信一切都非常标准。 (出于可读性原因,只是示例代码)
实体:汽车
@Entity
public class Car implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private id;
private String model;
// .... Setter
// .... Getter
}
服务类别:CarService
@Named
@Transactional
public class CarServiceImpl implements CarService {
@PersistenceContext
private EntityManager entityManager;
@Override
public List<Car> findAll() {
TypedQuery<Car> q = entityManager.createQuery(
"FROM Car", Car.class);
return q.getResultList();
}
@Override
public void saveEntity (Car car) {
/* What exactly am I doing here? */
}
}
控制器:CarEditController
@Named
public class CarEditController implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private CarService carService;
private List<Car> cars;
public List<Car> getCars () {
return carService.findAll();
}
public void setCars (List<Car> cars) {
this.cars = cars;
}
public void btn_newClick() {
Car newCar = new Car();
car setModel("BMW");
cars.add(newCar);
}
public void btn_saveClick() {
for (Car car : cars) {
carService.saveEntity(car);
}
}
}
我发现了很多保存实体的方法。显而易见的是 entityManager.merge(car) 用于现有实体,entityManager.persist(car) 用于新实体。理论上这很容易,但我怎么知道哪个实体是新的?
documentation 建议 entityManager.flush(),理论上它会更新所有现有实体并插入所有新实体。它有效,但前提是我使用 find() 获取实体。
问题:
我想一步获取所有实体,添加新实体,然后将它们全部保存在一个方法中 (btn_saveClick())。如何最好地完成这项任务?
【问题讨论】: