在表中添加和删除项目时如何正确使用EntityManager?
我目前正在使用Hibernate和JavaFX。
我的问题是: 我有这个JavaFX表,其中包含Fruit.class对象。我在此表上添加和删除对象,然后单击“保存”,我想更新数据库。 我应该如何设计使用EntityManager? 打开此屏幕时,我是否应该将EntityManager保持打开状态?根据SO上的一些帖子,我应该为完成的每个事务打开和关闭EntityManager。但是,在这种情况下,“事务”涉及添加和删除0 ... n Fruit.class对象。
换句话说,用户可以在保存之前添加和删除Fruits。
关于EntityManager,我该如何正确处理?
此外,对于“撤消”操作,我可以使用休眠状态的审核表吗?
public class FruitsController implements Initializable {
@FXML
private TableColumn<Fruit,Long> fruitId;
@FXML
private TableColumn<Fruit,String> fruitColor;
@FXML
private TableView<Fruit> fruitsTable;
@FXML
private Label labelTitle;
@FXML
private Button buttonSave;
@FXML
private Button undoaction;
@FXML
private MenuItem addFruitButton;
@FXML
private MenuItem removeFruitButton;
@FXML
void addFruit(actionEvent event) {
fruitsTable.getItems().add(new Fruit());
}
@FXML
void removeFruit(actionEvent event) {
int i = fruitsTable.getSelectionmodel().getSelectedIndex();
if(i > 0){
fruitsTable.getItems().remove(i);
}else{
Toolkit.getDefaultToolkit().beep();
}
}
@FXML
void saveFruits(actionEvent event) {
EntityManager entityManager = InitHibernate.getSessions().createEntityManager();
//fruitsTable.getItems()
entityManager.close();
}
@FXML
void undoLastaction(actionEvent event) {
}
@Override
public void initialize(URL location,ResourceBundle resources) {
fruitId.setCellValueFactory(new PropertyValueFactory<Fruit,Long>("id"));
fruitColor.setCellValueFactory(new PropertyValueFactory<>("color"));
fruitId.setCellFactory(TextFieldTableCell.forTableColumn(new LongStringConverter()));
fruitColor.setCellFactory(TextFieldTableCell.forTableColumn());
fruitColor.setEditable(true);
fruitsTable.setEditable(true);
fruitsTable.setItems(loadFruits());
InitHibernate.initHibernate();
}
/**
* *
* It returns and load from hibernate
*
* @return
*/
private ObservableList<Fruit> loadFruits() {
EntityManager em = null;
ObservableList<Fruit> observableArrayList = null;
try {
em = InitHibernate.getSessions().createEntityManager();
FruitDAO fruitDAO = new FruitDAO(em);
observableArrayList = FXCollections.observableArrayList(fruitDAO.getLista());
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (em != null) {
em.close();
}
}
return observableArrayList;
}
}